とらりもんHOME  Index  Search  Changes  Login

とらりもん - ビット演算 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

! C言語によるビット演算

* 16進法による表記: 0x??
例: 0xf    // 16進法のf、つまり10進法の15。
注: C言語では2進法の表記は無い。

* 左ビットシフト: <<
例: y = x << 2   // xを2ビット左にシフトした結果をyに代入。

* 右ビットシフト: <<
例: y = x >> 2   // xを2ビット右にシフトした結果をyに代入。

* 論理和: |
例: y = 0x0f | 0xf0 // 16進法で0fとf0という数値の論理和をyに。(結果は0xff)

!! プログラム例1: 整数を2進法で表記するプログラム
#include <stdio.h>

int printbin(int x)
{int i=0;
  int size=0;
  for (i=31; 0<=i; i=i-1)        // 32ビット整数を想定。
    printf("%d", (x >> i & 1));  // 表示したい桁を一番右にシフトし(x >> i), 抽出 ( & 1)
  printf("\n");
}

main()
{int x=0;
  scanf("%d", &x);  // 数値の読み込み
  printbin(x);   // 数値の書き出し
}

!! プログラム例2: 整数をビット反転するプログラム [[参考|http://qnighy.hatenablog.com/entry/20091006/1254832950]]
#include <stdio.h>
// xとして32ビット整数を想定。

int reverse(int x)
{x=(x & 0x5555) 0x55555555) << 1 | (x & 0xaaaa) 0xaaaaaaaa) >> 1; 1; // 隣り合うビットどうしを交換。5は0101, aは1010
  x=(x & 0x3333) 0x33333333) << 2 | (x & 0xcccc) 0xcccccccc) >> 2; 2; // 2ビットのブロックについて隣接ブロックどうしを交換。3は0011, cは1100。
  x=(x & 0x0f0f) 0x0f0f0f0f) << 4 | (x & 0xf0f0) 0xf0f0f0f0) >> 4; 4; // 4ビットのブロックについて隣接ブロックどうしを交換。fは1111
  x=(x & 0x00ff) 0x00ff00ff) << 8 | (x & 0xff00ff00) >>  8; // 8ビットのブロックについて隣接ブロックどうしを交換
  x=(x & 0x0000ffff) << 16
| (x & 0xff00) 0xffff0000) >> 8;16; // 16ビットのブロックについて隣接ブロックどうしを交換
  return(x);
}

int printbin(int x)
{int i=0;
  for (i=31; 0<=i; i=i-1)
    printf("%d", (x >> i & 1));
  printf("\n");

}

main()
{int x=1;
  scanf("%d", &x);
  printf("%d\n", reverse(x);printbin(x);
  printbin(reverse(x));

}