-6

我想说那是自学。

我们有两个整数。我想得到第三个元素,它等于两个整数之间的 XOR,但有约束。好的,让我举个例子更清楚。

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. 

但是 in 的第一位x应该与 的第二位进行异或y并存储为第一位 in t,第二位x与 y 的第一位进行异或并存储在 t 的第二位中,依此类推。
结果应该是:

t = x^y = 1100

我希望你明白这个问题。如果没有,我会尽力澄清。

4

3 回答 3

5

但 x 中的第一位应与 y 的第二位异或并存储为第一位 int t 和第二位 int x to > y 中的第一位并将第二位存储在 t 中,依此类推

...所以这实际上不是关于异或的问题,而是关于如何交换y.

您可以使用以下方法执行此操作:

  • (y & 0xaaaaaaaa) >> 1选择每对位的最高有效(最左边)位,并将它们全部向右移动一位。(0xaaaaaaaa101010....101010二进制的。)
  • (y & 0x55555555) << 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

其他回答者所说的。如果要反转它,请按位使用 not:

t = ~(x ^ y)

当然,考虑到整数的大小,它可能不是您想要的,但在这种情况下,您可以使用位掩码对其进行处理。例如,如果你想要 4 位:

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

于 2010-07-08T18:18:21.867 回答