2014-11-05 45 views
4

如何反轉int中的最後一位?反轉最後一位

int a = 11; 
System.out.print(a + " " + Integer.toBinaryString(a)) //11 1011 

int b = invertLastBit(a); 
System.out.print(b + " " + Integer.toBinaryString(b)); //10 1010 

我寫了這個:

static int invertLastBit(int i) 
{ 
    String s = Integer.toBinaryString(i); 
    if (s.charAt(s.length()-1) == '0'){ 
     s = s.substring(0,s.length() - 1); 
     s = s+"1"; 
    }else if (s.charAt(s.length()-1) == '1') { 
     s = s.substring(0, s.length() - 1); 
     s = s + "0"; 
    } 
    return Integer.parseInt(s, 2); 
} 

但我應該怎麼改寫invertLastBit()

回答

13

你可以使用按位異或:

int x = 5; // 101 
x = x^1; // 100 

使用你原來的例子:

int a = 11; 
System.out.println (a + " " + Integer.toBinaryString(a)); //11 1011 

int b = a^1; 
System.out.println (b + " " + Integer.toBinaryString(b)); //10 1010 
+0

太好了,謝謝! – maks28rus 2014-11-05 08:35:39

4

你甚至不必擔心轉換爲二進制。

如果數字爲奇數,則最後一位必須爲1,因此從數字中減1。

否則,如果數字是偶數,最後一位必須是0,將數字加1。

就是這樣。

static int invertLastBit(int i){ 
    if(i % 2 != 0) { //thanks harold 
     return i - 1; 
    } else { 
     return i + 1; 
    } 
} 

這並不難解釋爲什麼這會起作用。

+0

我很慚愧我的問題。這很明顯。謝謝! – maks28rus 2014-11-05 08:35:08

+0

由於'-1%2 == -1',這對於否定'i'不起作用。它會工作,如果你使用測試'(i&1)== 1'或'i%2!= 0' – harold 2014-11-05 09:22:39

+0

我只需要使用積極的我:)謝謝你的評論。 – maks28rus 2014-11-05 13:38:16