ビット演算
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)); }
Keyword(s):
References: