2010-07-08 98 views
-6

我想说的是自我学习。穿越异或运营商

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

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 = x^y = 1100 

我希望你明白的问题。如果不是,我会尽力澄清。

+4

没有冒犯但只有...什么? – IVlad 2010-07-08 18:18:18

+0

听起来类似于跨产品...问题会更清楚*没有提及XOR。 – 2010-07-08 18:21:21

+7

就像提示一样,键盘上有几个键没有使用,这可以帮助您创建更清晰的问题。它们包括但不限于:。 ,?和[shift]。 – 2010-07-08 18:22:09

回答

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的位置。

+0

是的,这是我想要的 – 2010-07-08 18:31:30

-1

其他回答者说的。如果要扭转这种局面,使用按位不是:

t = ~(x^y)

当然尽管它可能不是很你想要什么给你整的规模,在这种情况下,你可以再并将其与位掩码。例如,如果你想4位:

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

5

但在X第一比特应该进行异或的Y个第二位和被存储为第一位的int吨和第二位的int x至>在吨等y和存储的第二位的第一位

...所以这不是一个关于异或的问题,这是一个关于如何交换y的每一位的问题。

为此,您可以使用这样的事情:

  • (y & 0xaaaaaaaa) >> 1选择每对位的最显著(最左边)位,和一位移动他们没事。 (0xaaaaaaaa101010....101010二进制)。
  • (y & 0x55555555) << 1选择每对中最低有效位(最右边),并将它们全部向左移动一位。 (0x55555555010101....010101二进制)。
  • 所以:y_pairwise_bit_swapped = ((y & 0xaaaaaaaa) >> 1) | ((y & 0x55555555) << 1)将执行交换。

Then t = x^y_pairwise_bit_swapped

(显然,根据需要调整常量,以适应​​您的最大所需位宽。)