2012-02-21 2 views
2

私はビット操作を初めて行っています。 私の友人は最近、インタビューでこれを私に聞いた。 バイト配列 例:1000100101010101 | 001010011100 私たちは一度に2ビットを水平方向に一度に反転する必要があります。 新しい配列は次のようになります。 1000 | 0101など。アレイ内で一度に2ビットを反転する

など。 私たちは真ん中(ここで|でマーク)から始まり、一度に2ビットずつ外側に向かって進むと思います。 私はこのような時に数が単一ビットを反転する方法を知っている:

unsigned int reverse(unsigned int num) 
{ 
    unsigned int x = sizeof(num) * 8; 
    unsigned int reverse_num = 0, i, temp; 

    for (i = 0; i < x; i++) 
    { 
     temp = (num & (1 << i)); 
     if(temp) 
      reverse_num |= (1 << ((x - 1) - i)); 
    } 

    return reverse_num; 
} 

しかし、我々は効率的にインプレース2ビットを逆にすることができますどのように私は疑問に思います。 ありがとうございます。

+1

あなたはどのようにして '1000 | 0101'?そこにタイプミスがありますか? – LihO

+1

指定されたバイト配列は、(合計16ビット×12ビット)合計28ビット、または整数ではないように見えます。それはあなたの|真ん中にはありません。どうか明らかにしてください。 – abelenky

+0

なぜ、一度に8つだけではないのですか? –

答えて

2

私は一度に全部のバイト(またはそれ以上)を行うと思います。これを行うには

output = (input & 0x55) << 1; 
output |= (input & 0xAA) >> 1; 
0

「トリック」の方法は、ビットが反転してバイトのテーブルを事前に計算することです。次に、配列のバイトを使用してテーブルをインデックス化し、それを書き戻すことができます。他の人が言っているように - あなたのバイトには何ビットが入っていますか?

関連する問題