おぼえがき

過ちては則ち改むるにうんぬんかんぬん

ビット演算について(C言語)

f:id:feci:20210810151051j:plain

C11

 

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"aa << 1);   //1ビット左シフト:00011110 → 0x1e0
  printf("%x >> 1 = %x\n"aa >> 1);   //1ビット右シフト:00000111 → 0x7
  printf("%x | %x = %x\n"aba | b); //OR演算:11111111 → 0xff
  printf("%x & %x = %x\n"aba & 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となります。

 

 

以上です。