2017-02-23 6 views
-2

Я пытаюсь улучшить вопросы о стиле интервью. Я наткнулся на это:Пожалуйста, объясните этот код обмена битами (Java)

Учитывая 32-битный целочисленный ввод x, замените его нечетные и четные биты и верните полученное целое число. (например, бит 0 и бит 1 заменяются, бит 2 и бит 3 заменяются и т. д.). Например: х = 5, двоичный код = 0101 swapOddEvenBits (5) -> 10

Ответ был следующим:

public int swapOddEvenBits(int x) { 

return (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); 

} 

Может кто-то объяснить это, пожалуйста. Кроме того, почему я не могу использовать что-то вроде (x & 1010101010101) >> 1 вместо этого? Моя первоначальная попытка решить эту задачу состояла в том, чтобы преобразовать int в двоичные строки, а затем заменить соседние символы, а затем преобразовать обратно в int. Будет ли это работать? Спасибо.

ответ

2

Ваши значения int литералы в шестнадцатеричной

System.out.println(Integer.toBinaryString(0xaaaaaaaa)); 
System.out.println(Integer.toBinaryString(0x55555555)); 

Какие выходы

10101010101010101010101010101010 
1010101010101010101010101010101 

Вы можете заменить 0xaaaaaaaa с 0b10101010101010101010101010101010 и 0x55555555 с 0b1010101010101010101010101010101 для одних и тех же результатов.

+0

Благодарим вас за разъяснение. – Raul

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