研究次の2つの関数:
bool GetBit(int value, int bit_position)
{
return value & (1 << bit_position);
}
void SetBit(int& value, int bit_position, bool new_bit_value)
{
if (new_bit_value)
value |= (1 << bit_position);
else
value &= ~(1 << bit_position);
}
だから今、私たちは単にアレイのような任意のビットを読み書きすることができます。
1 << N
はあなたを与える:1は、N番目の位置にある
000...0001000...000
。
ので
1 << 0 == 0000...0000001
1 << 1 == 0000...0000010
1 << 2 == 0000...0000100
1 << 3 == 0000...0001000
...
のように。
今、私が二進数で、上記の数字のうちの1つを他の数字Yとするとどうなりますか?
X = 1 << N
Z = X & Y
Zはどのように見えますか?まあ、Nthから離れたすべてのビットは確かに0ではないでしょうか?それらのビットはXで0であるため、
ZのNビット目は何ですか?それはYのN番目のビットの値に依存しますか?どのような状況下ではZはゼロですか?正確には、YのNビット目が0であるため、Zをboolに変換することによって、YのNビット目の値を分けることができます。上記のGetBit関数をもう一度見てください。
ここでビットを読み取ると、どのようにビットを設定しますか? Zがここに起こっている
X = 1 << N
Z = Y | X
:私たちは上のビットを設定したい場合はまあ、私たちは、上から(1 < < N)のいずれかの番号でBINARY ORを使用することができますか?さて、N番目の権利を除いて、すべてのビットはYと同じになるでしょうか?そして、N番目のビットは常に1になります。そこで、N番目のビットをオンにしました。
ビットをゼロに設定するとどうなりますか?私たちがやりたいことは、11111011111のような数字を取ってN番目のビットだけをオフにしてから、BINARY AND ANDを使います。 N番目のは常にオフになりますY.のコピーになりますN番目から離れZで
X = 1 << N // 000010000
W = ~X // 111101111
Z = W & Y
だから、すべてのビット:私達はちょうどBINARY NOTを使用するように番号を取得します。したがって、N番目のビットを効果的に0に設定しました。
SetBitの実装方法は上記の2つの方法を使用しています。
これで、任意のビットを読み書きできます。これで配列のように番号のビットを反転することができます:
int ReverseBits(int input)
{
int output = 0;
for (int i = 0; i < N; i++)
{
bool bit = GetBit(input, i); // read ith bit
SetBit(output, N-i-1, bit); // write (N-i-1)th bit
}
return output;
}
これをすべて理解してください。このすべてを理解したら、ページを閉じて、見ずに実装してテストしてください。
これらのいくつか試すよりも、あなたはこれを楽しんでいる場合:
http://graphics.stanford.edu/~seander/bithacks.html
および/または、この本を入手:
http://www.amazon.com/exec/obidos/ASIN/0201914654/qid%3D1033395248/sr%3D11-1/ref%3Dsr_11_1/104-7035682-9311161
何が使用されるコードで、何の例ですがそれがうまくいかない入力? –
あなたはこの問題をすべて間違っていると思っています。とにかくそれは何を意味するのですか? 8ビット整数の反転ビットと考えることができます。私は以下の答えにたくさんのヒットをくれました。 –
助けがあれば、&演算子は、この問題を解決する方法の1つで始めることができる、かなり気の利いた使い方をしています。 – chris