C言語 | C言語入門 | ビット演算

ビット演算子は、整数値の各ビットを操作する。

ビット演算子

演算子 意味
& ビット単位のAND
` `
^ ビット単位のXOR
~ 1の補数
&=, ` =, ^=`

ANDは両方のビットが1の場合だけ1になる。マスクを使って特定のビットを取り出す場合に便利である。

  0101 1100
& 0000 1111
------------
  0000 1100

コード1

#include <stdio.h>

int main() {
 char ch5 = '5';
 printf("ch5: %%c = %c, %%X = %X, numeric = %d\n" , ch5 , ch5 , ch5 & 0x0F);
 return 0;
}

ORはどちらかのビットが1なら1になる。XORは2つのビットが異なる場合に1になる。補数はすべてのビットを反転する。

コード2

#include <stdio.h>

int main() {
 unsigned int value = 0xCC33CC33;
 printf("~%X = %X\n" , value , ~value);
 return 0;
}

ビットシフト

シフト演算子はビット列を左右へ移動する。

演算子 意味
<< 左シフト
>> 右シフト
<<=, >>= 複合代入形式
value << count
value >> count

符号なし値では、有効なビットが失われない範囲で1ビット左へ移動すると2倍、1ビット右へ移動すると2分の1に相当する。

コード3

#include <stdio.h>

int main() {
 unsigned int value = 100;
 printf("value / 4 = %u\nvalue * 4 = %u\n" , value >> 2 , value << 2);
 return 0;
}

移植可能なビット操作には符号なし値を使う。負の符号付き整数に対する右シフトは処理系定義であり、有効な幅を超えるシフトも避ける必要がある。