-6

それは独学だと言いたいです。

2つの整数があります。2つの整数間のXORに等しいが、制約がある3番目の要素を取得したいと思います。OK、もっと明確にするために例を挙げましょう。

int x is, let's say, is 10   `x = 10 //Binary 1010`  and `int y = 9 //Binary 1001`   

int t = x^y,  where ^ is an operator that is defined as described below. 

ただし、の最初のビットはxの2番目のビットとXORyされ、最初のビットとして格納され、Xtの2番目xのビットはyの最初のビットとXORされ、tの2番目のビットに格納されます。
したがって、結果は次のようになります。

t = x^y = 1100

問題をご理解いただければ幸いです。そうでない場合は、明確にしようとします。

4

3 に答える 3

5

ただし、xの最初のビットはyの2番目のビットに固定され、最初のビットinttおよび2番目のビットintxとして>yの最初のビットに格納され、2番目のビットはtに格納されます。

...したがって、これは実際にはxorに関する質問ではなく、のビットの各ペアを交換する方法に関する質問ですy

次のようなものを使用してこれを行うことができます:

  • (y & 0xaaaaaaaa) >> 1ビットの各ペアの最上位(左端)のビットを選択し、それらを1ビットだけ右に移動します。(バイナリです。0xaaaaaaaa101010....101010
  • (y & 0x55555555) << 1各ペアの最下位(右端)ビットを選択し、それらをすべて1ビット左に移動します。(バイナリです。0x55555555010101....010101
  • だから:y_pairwise_bit_swapped = ((y & 0xaaaaaaaa) >> 1) | ((y & 0x55555555) << 1)スワッピングを実行します。

次にt = x ^ y_pairwise_bit_swapped

(もちろん、必要な最大ビット幅に合わせて定数を調整してください。)

于 2010-07-08T18:42:22.197 に答える
2

これはどういう意味ですか?

1 0 1 0
 x   x
1 0 0 1

=> t = 1 xor 0 + 0 xor 1 + 1 xor 1 + 0 xor 0 = 1100 (+ = concat)

これを試して:

int getBit(int num, int bitNum)
{
   --bitNum;
    return (num & (1 << bitNum)) > 0 ? 1 : 0;
}

int main()
{
    int x = 10, y = 9;
    int size = 4;

    int t = 0;
    for ( int i = 0; i < size; ++i )
        if ( i % 2 == 0 )
            t |= (getBit(x, size - i) ^ getBit(y, size - i - 1)) << (size - i - 1);
        else
            t |= (getBit(x, size - i) ^ getBit(y, size - i + 1)) << (size - i - 1);

    cout << t;

    return 0;
}

最上位ビットの位置である数値の「サイズ」、またはを知る必要がありますlog2(number) + 1

于 2010-07-08T18:24:31.943 に答える
-1

他の回答者が言ったこと。それを逆にしたい場合は、ビット単位では使用しないでください。

t = ~(x ^ y)

もちろん、整数のサイズを考えると、それはあなたが望むものではないかもしれませんが、その場合は、ビットマスクを使用してそれを行うことができます。たとえば、4ビットが必要な場合:

t = (~(x ^ y)) & 15;

于 2010-07-08T18:18:21.867 に答える