2012/06/19

C言語 ビット演算子

ビット演算子 <<, >>

バイナリを扱うときによく使う。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 目次はこちら