2017-07-25 133 views
-2

給出整數n,值v(v = 0或1)和位置p。編寫一個修改n的運算符序列,使n的二進制表示在位置p保存值v。例如:Java簡單按位運算

  • N = 5(00000101)中,p = 3,V = 1 - > 13(00001101)
  • N = 5(00000101)中,p = 2,V = 0 - > 1(00000001 )

這是我的代碼:

int n1 = 35; 
int p1 = 3; 
int v = 1; 
n1 = n1 + (v << p1); 
System.out.println(n1); 

它的工作原理時,v = 1而當v = 0它沒有。

+0

使用總和,如果v = 0,你加0(移位不改變它是0的事實),所以該值不會改變。您可能想在那裏尋找不同的操作。可能有點操作。 – bracco23

+0

我沒有回答解決方案,因爲這絕對看起來像一個任務,你應該可以自己做到。 – bracco23

+0

@ bracco23它看起來像一個任務,對於這樣的事情,我通常提供沒有代碼的方法。希望你不介意。乾杯。 –

回答

0

既然要「集」的索引值,你需要兩個中的一個操作

'and' will set 0 values at an index to 0, but won't work for 1 values 
'or' will set 1 values at an index to 1, but won't work for 0 values 

現在你需要做的就是把正確數量的正確索引。這可以通過轉移1

'<<' moves the 1 a number of places 

例如

'1 << 3' shifts the 1 three places, resulting in '00001000' 

記得要做,我們需要一個零的一些操作,在那個地方得到一個零,你需要反轉位

'not' or '~' flips all the bits in a number 

~00001000 yeilds 11110111 

現在我們可以有1或我們希望,並且只需要使用if語句來挑基礎上所需的操作是正確的,並應用相應的and或指數操作來設置我們想要的位。

0

好吧我認爲這是行得通的,但是如何在控制檯上正確打印結果呢?

// Swapping i and j: i ^= j, j ^= i, i ^= j; 
    // Getting the pth byte: (n >> p) & 1 
    // Setting the pth byte to v: (v == 0) ? (n & ~(1 << p)) : (n | 1 << p) 
    static int Exchange(int n, int i, int j) 
    { 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j); 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << i)) : (n | 1 << i); 
     n = ((n >> i) & 1^(n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j); 

     return n; 
    } 

    public static void main(String[] arguments) 
     { 
      int n = 56, p = 3, q = 24, k = 3; 

      while (k-- != 0) n = Exchange(n, p++, q++); 
     }