Как bitshifting работает в Java?

У меня есть этот оператор:

Примите битовое значение байта x 00101011. из чего результат x>>2?

Как я могу программировать его, и кто-то может объяснить меня, что делает?

59
задан Jeroen Vannevel 1 May 2015 в 14:15
поделиться

6 ответов

Когда вы сдвигаете вправо 2 бита, вы отбрасываете 2 наименее значимых бита. Таким образом:

x = 00101011

x >> 2

// now (notice the 2 new 0's on the left of the byte)
x = 00001010

Это по сути то же самое, что делить int на 2, 2 раза.

In Java

byte b = (byte) 16;
b = b >> 2;
// prints 4
System.out.println(b);
16
ответ дан 24 November 2019 в 18:01
поделиться

>> - это оператор арифметического сдвига вправо. Все биты в первом операнде сдвинуты на количество разрядов, указанное вторым операндом. Крайним левым битам в результате присваивается то же значение, что и крайним левым битам исходного числа. (Это значит, что отрицательные числа остаются отрицательными.)

Вот ваш конкретный случай:

00101011
  001010 <-- Shifted twice to the right (rightmost bits dropped)
00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number)
5
ответ дан 24 November 2019 в 18:01
поделиться
byte x = 51; //00101011
byte y = (byte) (x >> 2); //00001010 aka Base(10) 10
2
ответ дан 24 November 2019 в 18:01
поделиться

Вы можете использовать, например, этот API, если вы хотите видеть представление ваших чисел bitString. Uncommons Math

Пример (в jruby)

bitString = org.uncommons.maths.binary.BitString.new(java.math.BigInteger.new("12").toString(2))
bitString.setBit(1, true)
bitString.toNumber => 14

редактировать : изменена ссылка api и добавлен небольшой пример

2
ответ дан 24 November 2019 в 18:01
поделиться
public class Shift {
 public static void main(String[] args) {
  Byte b = Byte.parseByte("00101011",2);
  System.out.println(b);
  byte val = b.byteValue();
  Byte shifted = new Byte((byte) (val >> 2));
  System.out.println(shifted);

  // often overloked  are the methods of Integer

  int i = Integer.parseInt("00101011",2);
  System.out.println( Integer.toBinaryString(i));
  i >>= 2;
  System.out.println( Integer.toBinaryString(i));
 }
}

Вывод:

43
10
101011
1010
4
ответ дан 24 November 2019 в 18:01
поделиться

Вы не можете писать двоичные литералы, такие как 00101011 на Java, поэтому вы можете записать его в шестнадцатеричном формате. :

byte x = 0x2b;

Чтобы вычислить результат x >> 2 , вы можете просто написать именно это и распечатать результат.

System.out.println(x >> 2);
2
ответ дан 24 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: