2010-07-08 79 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

(顯然,根據需要調整常量,以適應​​您的最大所需位寬。)