文字のさまざまなビットの状態を知りたい
私がしたとしましょう:
char a = 11 //00001011 in binary
現在 0 であるビット番号 5 を取得して bool 変数にキャストするにはどうすればよいですか? どうすれば設定できますか?
文字のさまざまなビットの状態を知りたい
私がしたとしましょう:
char a = 11 //00001011 in binary
現在 0 であるビット番号 5 を取得して bool 変数にキャストするにはどうすればよいですか? どうすれば設定できますか?
いくつかのビット演算子を使用できます。
bool fifthBitSet = a & 0x10;
または、より一般的に:
bool nThBitSet = a & ( 0x1 << n );
設定部分を逃した:
a |= 0x1 << n; // set n'th bit
あなたが指摘したように:
char a = 11 // == 00001011 in binary
あなたはbit number 5
今ははっきりしていると言ったので、*ビットについて話しているときにビットの位置を定義しましょう:
pos 8 7 6 5 4 3 2 1
value [0][0][0][0][1][0][1][1]
5 番目のビットをテストしたい場合、つまり 5 番目のビットにアクセスするマスクが必要です。いくつかのマスクを次に示します。
your number: 00001011
0x1 mask: 00000001
0x2 mask: 00000010
0x4 mask: 00000100
0x8 mask: 00001000
0x10 mask: 00010000 <-- So that's the one we want, the 5th bit
ビットを設定するには、ビット単位の OR (|) が必要です
a |= 0x10; // 00001011
// | 00010000 because 1 | anything = 1
// ----------
// 00011011 The value is set!
ビットをテストするには、ビットごとの AND (&) を使用できます。
bool something = a & 0x10; // 00001011
// & 00010000 because only 1 & 1 = 1
// ----------
// 00000000 something will be 0 (false)
*より一般的な 0 ベースのインデックス作成とは対照的に、これは 1 ベースのインデックス作成であることが指摘されました。これは本当です。説明に基づいて、質問を「ビット番号5」として読むことを選択しました。これは、8ビットのうちの1、2、3、4などの典型的な(人間の)ベースのカウントを意味します。
0 ベースのインデックスを使用したい場合、これは問題ありません。同じロジックを 1 つ「シフト」するだけです。0 ベースのインデックスの「5 番目」のビットのマスクは次のとおりです。0x20
ビットについて話すときは、どれが最下位ビットで、0 または 1 に基づいているかを完全に明確にすることをお勧めします。
あなたはビット番号 5に言及していますが、5番目の最下位ビットを見ていると思います。
また、特定の位置にビットを設定する方法についても質問しました。そのためには、ビットごとの OR - を使用します|
。
a = a | 0x10;
すでに回答されているように、ビットごとの AND - を使用してビットをテストします&
。
bool isSet = a & 0x10;
多くの場合、 のような位置フラグを使用します0x10
が、ビット シフトを使用して与えられる一般化は、特にこれらを関数にラップする場合に非常に役立ちます。
int pos = 5;
// set bit 5:
a = a | (0x1 << pos);
// test bit 5:
bool isSet = a & (0x1 << pos);
詳細については、ビット演算に関するウィキペディアの記事が非常に優れています。
ビットマスクを使用してビットをテストできます。
a & 0b00010000
右端のビットを 0 として数えます。
テストするには:
int b = 5;
bool n = a & (1 << b);
ビットをセット (またはクリア) するにはb
:
if (n) { // set
a |= (1 << b); // RHS only has bit 'b' set
} else { // clear
a &= ~(1 << b); // RHS has every bit _except_ bit 'b' set
}
さて、この一連の関数を使用して、ビット状態を取得および設定できると思います。
bool getBit(int data, int bitNumber) {
int flag = 1 << bitNumber - 1;
return (bool)(data & flag);
}
void setBit(int& data, int bitNumber) {
int flag = 1 << bitNumber - 1;
data |= flag;
}
...
int main() {
int a = 11;
cout << getBit(a, 5); // false
setBit(a, 5);
cout << getBit(a, 5); // true
}
それでも、ビットセットではなく、なぜこれを使用する必要があるのだろうか。)
ビットごとの AND を使用して状態を知ることができます。
unsigned int number = 11;
確認したいビット位置だけを設定した数値と残りのビットを0にした数値のAND。
ビット 0 をチェックするとします。
if(a&0x00000001)
puts(" 01h bit position is 1")
else
puts(" 01h bit position is 0")