1

文字のさまざまなビットの状態を知りたい

私がしたとしましょう:

char a = 11 //00001011 in binary

現在 0 であるビット番号 5 を取得して bool 変数にキャストするにはどうすればよいですか? どうすれば設定できますか?

4

7 に答える 7

6

いくつかのビット演算子を使用できます。

bool fifthBitSet = a & 0x10;

または、より一般的に:

bool nThBitSet = a & ( 0x1 << n );

設定部分を逃した:

a |= 0x1 << n; // set n'th bit
于 2012-10-18T13:57:35.010 に答える
4

あなたが指摘したように:

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 に基づいているかを完全に明確にすることをお勧めします。

于 2012-10-18T14:20:10.143 に答える
2

あなたはビット番号 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);

詳細については、ビット演算に関するウィキペディアの記事が非常に優れています。

于 2012-10-18T14:02:55.250 に答える
2

ビットマスクを使用してビットをテストできます。

a & 0b00010000
于 2012-10-18T13:57:37.833 に答える
2

右端のビットを 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
}
于 2012-10-18T13:57:46.227 に答える
1

さて、この一連の関数を使用して、ビット状態を取得および設定できると思います。

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
}

それでも、ビットセットではなく、なぜこれを使用する必要があるのだろうか。)

于 2012-10-18T14:01:17.007 に答える
0

ビットごとの AND を使用して状態を知ることができます。

unsigned int number = 11;

確認したいビット位置だけを設定した数値と残りのビットを0にした数値のAND。

ビット 0 をチェックするとします。

if(a&0x00000001)
   puts(" 01h bit position   is 1")
else
   puts(" 01h bit position   is 0")
于 2015-11-30T09:02:23.737 に答える