このページの解説は C99 をベースとしています。
以下は目次です。
ある符号無し整数型の値を構成する複数のビットの中の、任意の位置のビットが 1 かどうかを判定したいとします。
ビット演算は原則的に、符号無し整数型に対して使用します(第49章)
ここでいう「任意のビット」は、特定の1つのビットでもいいですし、2ビット以上連続したり、飛び飛びであったりしてもいいものとします。たとえば、
といった具合です。
あるビットが 1 かどうか判定するには、ビット積(ビットAND)(第49章)を使います。
調べたいビットにだけ “1” が立っている整数を用意し(これを BITS とします)、ターゲットの整数とのあいだでビット積を取ります。その結果が BITS と同じになれば、指定のビットのすべてが 1 になっています。
if ((ターゲットの整数 & BITS) == BITS) {
// 調べたいビットのすべてが 1 になっている
}
else {
// 調べたいビットのいくつかは 1 になっていない
}
実際に試してみます。結果をみたいので、if文はなくなり、printf関数の実引数の中で判定しています。
#include <stdio.h>
int main(void)
{
unsigned char n1 = 0xf0;
unsigned char n2 = 0x80;
unsigned char n3 = 0x7f;
// 一番上位のビットが 1 かどうか
("%d\n", (n1 & 0x80) == 0x80);
printf("%d\n", (n2 & 0x80) == 0x80);
printf("%d\n", (n3 & 0x80) == 0x80);
printf("----");
puts
// 下位から数えて、3~7 ビット目の範囲がすべて 1 かどうか
("%d\n", (n1 & 0x3c) == 0x3c);
printf("%d\n", (n2 & 0x3c) == 0x3c);
printf("%d\n", (n3 & 0x3c) == 0x3c);
printf("----");
puts
// 奇数ビットがすべて 1 かどうか
("%d\n", (n1 & 0x55) == 0x55);
printf("%d\n", (n2 & 0x55) == 0x55);
printf("%d\n", (n3 & 0x55) == 0x55);
printf("----");
puts}
実行結果:
1
1
0
----
0
0
1
----
0
0
1
----
桁が多いと分かりづらいので、ここでは unsigned char型を使って、8bit の符号無し整数型で試しています。もっと大きい型を使っても、ビットの数が増えるだけで、やり方はなんら変わりません。
指定したビット “だけ” が 1 であるという判定ではないことに注意してください。指定しなかったビットにも 1 が立っている可能性はあります。たとえば、一番最初の printf関数のところで、0xf0 と 0x80 でビット積を取っています。0xf0 は2進法では 11110000、0x80 は2進法では 10000000 ですから、
11110000
& 10000000
----------
10000000
という演算になります。余計なところに 1 が立っていますが、結果としては
0x80 と同じになりますから、(0xf0 & 0x80) == 0x80
は真です。
指定したビット “だけ” が 1
であるという判定が必要ならば、はじめから
==演算子で比較すればいいだけです。0x80 == 0x80
なら真になりますが、0xf0 == 0x80
は偽になります。
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |