C11におけるビット演算について。
#include <stdio.h> //いつもの
void main() {
unsigned char a = 0xf; //16進数の16なので2進数の00001111
unsigned char b = 0xff; //16進数の255なので2進数の11111111
printf("%x << 1 = %x\n", a, a << 1); //1ビット左シフト:00011110 → 0x1e0
printf("%x >> 1 = %x\n", a, a >> 1); //1ビット右シフト:00000111 → 0x7
printf("%x | %x = %x\n", a, b, a | b); //OR演算:11111111 → 0xff
printf("%x & %x = %x\n", a, b, a & b); //AND演算:00001111 → 0xf
printf("~%x = %x\n", a, (unsigned char)~a); //NOT演算:11110000 → 0xf0
}
void main() {
unsigned char a = 0xf; //16進数の16なので2進数の00001111
unsigned char b = 0xff; //16進数の255なので2進数の11111111
printf("%x << 1 = %x\n", a, a << 1); //1ビット左シフト:00011110 → 0x1e0
printf("%x >> 1 = %x\n", a, a >> 1); //1ビット右シフト:00000111 → 0x7
printf("%x | %x = %x\n", a, b, a | b); //OR演算:11111111 → 0xff
printf("%x & %x = %x\n", a, b, a & b); //AND演算:00001111 → 0xf
printf("~%x = %x\n", a, (unsigned char)~a); //NOT演算:11110000 → 0xf0
}
ビット演算とは、ビット演算子を使った演算のことです。
unsigned char型は8ビット符号なし整数であり、その最大値は255となっています。
0xfの先頭の0xは16進数を意味する符号であり、fは16進数の15を表しています。
16進数の10~15はそれぞれa~fのアルファベットに対応しています。
なのでfは15となりますし、ffは255となるわけですね。
そしてその15を2進数で表すと1111となりますし、255を2進数で表すと11111111となるわけです。
今回は、この0xfとoxffを使ってビット演算をしていきます。
〇1ビット左シフト(<<)
<<は2進数を左に1つずらすビット演算子です。
00001111 は、
↓
00011110 となります。
〇1ビット右シフト(>>)
>>は2進数を右に1つずらすビット演算子です。
00001111は、
↓
00000111となります。
〇OR演算(|)
|は引数である2進数のどちらか片方が1なら1になるビット演算子です。
00001111と
11111111では、
↓
11111111となります。
〇AND演算(&)
&は引数である2進数の両方が1なら1になるビット演算子です。
00001111と
11111111では、
↓
00001111となります。
〇NOT演算(~)
~は引数である2進数の1と0が逆になるビット演算子です。
00001111は、
↓
11110000となります。
以上です。