2014-11-05 3 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

4

Вам даже не придется беспокоиться о преобразовании в двоичную.

Если число нечетное, последний бит должен быть одним, таким образом, вычесть 1 из числа.

В противном случае, если число четное, последний бит должен быть 0, добавить 1 к числу.

Это все.

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

Нетрудно понять, почему это работает.

+0

Мне стыдно за мой вопрос. Это очевидно. Спасибо! – maks28rus

+0

Это не работает для отрицательного 'i', потому что' -1% 2 == -1'. Он будет работать, если вы использовали тест '(i & 1) == 1' или' i% 2! = 0' – harold

+0

Мне нужно использовать только положительные i :) Спасибо за замечание. – maks28rus

Смежные вопросы