2012-03-24 15 views
0

こんにちは、私がする必要がある学校の割り当てのための質問を持っています。 ビット0ビット7 ビット1とビット6 ビット2とビット5 ビット3とビット4ビット単位のbitmanipulationパズル

と例によって:

は、今は変更する必要が

iがヘクスF703を使用する場合03 = 0000 0011とC0 = 1100 0000 のため、F7C0 になります(右のバイト(8ビット)のみを切り替える必要があります)。 ビット操作に関するレッスンがありましたが、六角形。 enter image description here

I`amは今誘い込むために不可解な

私はこの問題のためのアレイを使用するため考えていますか誰かが私はビット単位^、&、〜で行うことができると言うことができ、< <、>> 、オペレータ???

+1

何が使用されるコードで、何の例ですがそれがうまくいかない入力? –

+0

あなたはこの問題をすべて間違っていると思っています。とにかくそれは何を意味するのですか? 8ビット整数の反転ビットと考えることができます。私は以下の答えにたくさんのヒットをくれました。 –

+0

助けがあれば、&演算子は、この問題を解決する方法の1つで始めることができる、かなり気の利いた使い方をしています。 – chris

答えて

0

研究次の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

0

基本的にビットの順序を逆にする必要があります。 これはあなたのために解決するつもりはありませんが、ここにヒントがあります:

2ビットの値を持っていたらどうなりますか?どのようにこれらのビットを元に戻しますか?

単純なスワップがうまくいくでしょうか?使用可能な演算子でこのスワップをコーディングする方法について考えてみましょう。

ここで、4ビットの値があるとします。どのようにこれらのビットを元に戻しますか?

2つの2ビット値に分割し、それぞれを逆にしてスワップできますか?それはあなたに正しい結果を与えるでしょうか?これをコード化してください。

8ビット値に対するその解決策を一般化するのは簡単なことです。

幸運を祈る!

0

これは仕事の4分の1ですが、それ以上の助けはしません。私がなぜそれを言ったのか分かっていれば、残りのコードを記入できるはずです。

if ((i^(i >> (5 - 2))) & (1 >> 2)) 
    i ^= (1 << 2) | (1 << 5);