我想说的是自学。
我们有两个整数。我想得到第三个元素,它等于两个整数之间的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.
但是x
中的第一位应该与y
的第二位进行异或,并存储为t
中的第一位和x
中的第二位。 y中的第一位并存储在t中的第二位,依此类推
结果应该是:
t = x^y = 1100
我希望你能理解这个问题。如果没有,我会尽力澄清。
答案 0 :(得分:5)
但是x中的第一位应该是x的第二位x并且存储为第一位int t和第二位int x存储到> y中的第一位和t中存储的第二位,依此类推
...所以这不是关于xor的问题,这是关于如何交换y
的每一对比特的问题。
您可以使用以下内容执行此操作:
(y & 0xaaaaaaaa) >> 1
选择每对位中最重要(最左边)的位,并将它们向右移动一位。 (0xaaaaaaaa
为101010....101010
二进制文件。)(y & 0x55555555) << 1
选择每对中最不重要(最右边)的位,并将它们全部向左移动一位。 (0x55555555
为010101....010101
二进制文件。)y_pairwise_bit_swapped = ((y & 0xaaaaaaaa) >> 1) | ((y & 0x55555555) << 1)
将执行交换。然后t = x ^ y_pairwise_bit_swapped
。
(显然,根据所需的最大位宽调整常数。)
答案 1 :(得分: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
。
答案 2 :(得分:-1)
其他回答者说了什么。如果要反转它,请使用按位而不是:
t = ~(x ^ y)
当然,考虑到整数的大小,它可能不是你想要的,在这种情况下,你可以使用位掩码。例如,如果你想要4位:
t = (~(x ^ y)) & 15;