交叉XOR运算符

dat*_*ili -6 xor

我想说的是自学.

我们有两个整数.我想得到第三个元素,它等于两个整数之间的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. 
Run Code Online (Sandbox Code Playgroud)

但第一比特在x应的第二位进行异或运算y,并被存储为第一比特t和第二比特x进行异或运算与y中的第一位,并存储在吨等所述第二位.
结果应该是:

t = x^y = 1100
Run Code Online (Sandbox Code Playgroud)

我希望你能理解这个问题.如果没有,我会尽力澄清.

Mat*_*ery 5

但是x中的第一位应该是x的第二位x并且存储为第一位int t和第二位int x存储到y中的第一位并且存储在t中的第二位,依此类推

...所以这不是一个关于xor的问题,这是一个关于如何交换每对比特的问题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.

(显然,根据所需的最大位宽调整常数.)