10進数 2進数 16進数
1 : 0000 0000 0000 0001 : 0x1
2 : 0000 0000 0000 0010 : 0x2
3 : 0000 0000 0000 0011 : 0x3
4 : 0000 0000 0000 0100 : 0x4
5 : 0000 0000 0000 0101 : 0x5
( 中 略 )
13 : 0000 0000 0000 1101 : 0xd
14 : 0000 0000 0000 1110 : 0xe
15 : 0000 0000 0000 1111 : 0xf
16 : 0000 0000 0001 0000 : 0x10
ですから、0000000000010000となります。
ビット列<<左へビットシフトする桁数
ビット例>>右へビットシフトする桁数
つまり、16>>4は1、16<<4は256ということになります。
10進数 2進数 16進数
16>>4 1 : 0000 0000 0000 0001 : 0x1
16 : 0000 0000 0001 0000 : 0x10
16<<4 256 : 0000 0001 0000 0000 : 0x100
#include<stdio.h>
main(){
int a=0xabc;
printf("0xabc>>4 : 0x%x\n",a>>4);
printf("0xabc>>8 : 0x%x\n",a>>8);
printf("0xabc<<4 : 0x%x\n",a<<4);
printf("0xabc<<8 : 0x%x\n",a<<8);
}
実行結果
0xabc>>4 : 0xab
0xabc>>8 : 0xa
0xabc<<4 : 0xabc0
0xabc<<8 : 0xbc00
それではこれはどうでしょう。
#include<stdio.h>
main(){
int a=0xabcd;
printf("0xabcd>>4 : 0x%x\n",a>>4);
printf("0xabcd>>8 : 0x%x\n",a>>8);
printf("0xabcd>>12: 0x%x\n",a>>12);
printf("0xabcd>>16: 0x%x\n",a>>16);
}
で、実行結果は、貴方の予想に反して(?)以下のようになります。0xabcd>>4 : 0xfabc 0xabcd>>8 : 0xffab 0xabcd>>12: 0xfffa 0xabcd>>16: 0xffff見ての通り、右シフトによって空いた部分に、0ではなくfが入っています。 その理由を説明したいと思います。
16進数 10進数
0x7fff >> 4 : 0x07ff : 2047
0x7fff >> 8 : 0x007f : 127
0x7fff >> 12 : 0x0007 : 7
0x7fff >> 16 : 0x0000 : 0
といった結果になります。それに対して、負の整数である(int)0x8000(10進数で-32768)の場合は、以下のようになります。
16進数 10進数
0x8000 >> 4 : 0xf800 : -2048
0x8000 >> 8 : 0xff80 : -128
0x8000 >> 12 : 0xfff8 : -8
0x8000 >> 16 : 0xffff : -1
つづく。