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