2.1 ビットシフト演算


<例題1> unsigned int型変数x に格納されている値3を左に2ビットシフトする。

#include <stdio.h>

int main (void) {
   unsigned int x = 3;
   printf("x = %3d, 16進数 : %x\n", x, x);
 
   x = x << 2;

   printf("x = %3d, 16進数 : %x\n", x, x);

   return 0;
}

答は、いくつになるだろう。 3 は、下位8ビットが0000 0011だから


<例題2> 45を右に2ビットシフトする。
#include <stdio.h>

int main (void) {
   unsigned int x = 45;
   printf("x = %3d, 16進数 : %x\n", x, x);
 
   x = x >> 2;

   printf("x = %3d, 16進数 : %x\n", x, x);

   return 0;
}

答は、いくつになるだろう。 45は、下位8ビットが0010 1011だから


<例題3> 16進数abcdを2ビットだけ右に論理シフトした値を求めよ

#include <stdio.h>

int main (void) {
   unsigned int x = 0xabcd;  
   printf("x = %3d, 16進数 : %x\n", x, x);
 
   x = x >> 2;

   printf("x = %3d, 16進数 : %x\n", x, x);

   return 0;
}

答えはいくつになるだろう。0x abcd  は、A 10 B 11 C 12 D 13 だから、1010 1011 1100 1101 。
シフトの結果、ビット列はどうなるだろう


<問題> キーボードから入力した正の整数を5倍して表示するプログラムを、シフト演算子を用いて書け



解答例

#include <stdio.h>

int main (void) {
   unsigned int x, y, z;

   printf("正の整数 : ");
   scanf("%d", &x);

   printf(" x = %3d, 16進数 : %x\n", x, x);


   y = x << 2;
   z = y + x;



   printf("5x = %3d, 16進数 : %x\n", z, z);

   return 0;
}