とらりもん - ビット演算 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));
}
* 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 &
x=(x &
x=(x &
x=(x &
x=(x & 0x0000ffff) << 16 | (x &
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);
printbin(reverse(x));
}