ビット演算子 <<, >>
バイナリを扱うときによく使う。2進数の演算なので、分かりやすいように2進数表示の関数も自作して2進数で表示させてみた。
#include <stdio.h>
/* 2進数表示関数 */
void binNumShort(unsigned short num)
{
const BYTE = 8;
int i,j;
int barray[sizeof(short)*BYTE];
int binary;
printf("%s","Binary Number: ");
for(i=0; i<sizeof(short)*BYTE; i++){
barray[i] = 0;
}
if(num != 0){
for(i=1; num>0; i++){
binary = num % 2;
barray[sizeof(short)*BYTE-i] = binary;
num = num / 2;
}
}
for(i=0; i<sizeof(short)*BYTE; i++){
if(i==BYTE)printf(" ");
printf("%d",barray[i]);
}
printf("\n");
return;
}
/* メイン関数 */
int main(void)
{
unsigned short num = 0xff;
binNumShort(num);
printf("Decimal Number: %d\n",num);
binNumShort(num<<1);
printf("Decimal Number: %d\n",num<<1);
binNumShort(num>>1);
printf("Decimal Number: %d\n",num>>1);
return 0;
}
|
ビットシフトの例。2進数で見ると明らかで、単にずらしただけ。空いたところには0を入れている。10進数で表示すると、2倍になったり、1/2になったりする。これらを利用することで高速に演算したり、バイト単位での操作ができるようになる。
Binary Number: 00000000 11111111
Decimal Number: 255
Binary Number: 00000001 11111110
Decimal Number: 510
Binary Number: 00000000 01111111
Decimal Number: 127
|
ビット演算子 AND OR NOT
#include <stdio.h>
/* 2進数表示関数 */
int binNumShort(unsigned short num)
{
const BYTE = 8;
int i,j;
int barray[sizeof(short)*BYTE];
int binary;
for(i=0; i<sizeof(short)*BYTE; i++){
barray[i] = 0;
}
if(num != 0){
for(i=1; num>0; i++){
binary = num % 2;
barray[sizeof(short)*BYTE-i] = binary;
num = num / 2;
}
}
for(i=0; i<sizeof(short)*BYTE; i++){
if(i==BYTE)printf(" ");
printf("%d",barray[i]);
}
printf("\n");
return;
}
/* メイン関数 */
int main(void)
{
unsigned short num1 = 0xff00;
unsigned short num2 = 0xAAAA;
/* AND演算子 */
printf("AND演算子\n");
binNumShort(num1);
printf("&\n");
binNumShort(num2);
printf("\n");
binNumShort(num1 & num2);
/* OR演算子 */
printf("\nOR演算子\n");
binNumShort(num1);
printf("|\n");
binNumShort(num2);
printf("\n");
binNumShort(num1 | num2);
/* NOT演算子 */
printf("\nNOT演算子\n");
binNumShort(num1);
printf("~\n");
binNumShort(~num1);
return 0;
}
|
ビット演算子は2つの値を2進数に変換して各ビットごとに見ていくと分かりやすい。
ANDは両方とも1であれば1となる。
ORはどちらかが1であれば1となる。
NOTはひとつの値を反転させ、1は0になり、0は1となる。
AND演算子
11111111 00000000
&
10101010 10101010
10101010 00000000
OR演算子
11111111 00000000
|
10101010 10101010
11111111 10101010
NOT演算子
11111111 00000000
~
00000000 11111111
|
C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら