とらりもんHOME  Index  Search  Changes  Login

ビット演算

C言語によるビット演算

  • 16進法による表記: 0x??
例: 0xf    // 16進法のf、つまり10進法の15。

注: C言語では2進法の表記は無い。

  • 左ビットシフト: <<
例: y = x << 2   // xを2ビット左にシフトした結果をyに代入。
  • 右ビットシフト: <<
例: y = x >> 2   // xを2ビット右にシフトした結果をyに代入。
  • 論理和: |
例: y = 0x0f | 0xf0 // 16進法で0fとf0という数値の論理和をyに。(結果は0xff)

プログラム例1: 整数を2進法で表記するプログラム

#include <stdio.h>

int printbin(int x)
{int i=0;
 int size=0;
 for (i=31; 0<=i; i=i-1)        // 32ビット整数を想定。
   printf("%d", (x >> i & 1));  // 表示したい桁を一番右にシフトし(x >> i), 抽出 ( & 1)
 printf("\n");
}

main()
{int x=0;
 scanf("%d", &x);  // 数値の読み込み
 printbin(x);   // 数値の書き出し
}

プログラム例2: 整数をビット反転するプログラム → 参考

#include <stdio.h>
// xとして32ビット整数を想定。

int reverse(int x)
{x=(x & 0x55555555) <<  1 | (x & 0xaaaaaaaa) >>  1; // 隣り合うビットどうしを交換。5は0101, aは1010
 x=(x & 0x33333333) <<  2 | (x & 0xcccccccc) >>  2; // 2ビットのブロックについて隣接ブロックどうしを交換。3は0011, cは1100。
 x=(x & 0x0f0f0f0f) <<  4 | (x & 0xf0f0f0f0) >>  4; // 4ビットのブロックについて隣接ブロックどうしを交換。fは1111
 x=(x & 0x00ff00ff) <<  8 | (x & 0xff00ff00) >>  8; // 8ビットのブロックについて隣接ブロックどうしを交換
 x=(x & 0x0000ffff) << 16 | (x & 0xffff0000) >> 16; // 16ビットのブロックについて隣接ブロックどうしを交換
 return(x);
}

int printbin(int x)
{int i=0;
 for (i=31; 0<=i; i=i-1)
   printf("%d", (x >> i & 1));
 printf("\n");
}

main()
{int x=1;
 scanf("%d", &x);
 printbin(x);
 printbin(reverse(x));
}
Last modified:2013/03/10 20:46:55
Keyword(s):
References: