在Java中如何移位工作?

我有这样的说法:

假设字节x的位值是00101011. x>>2的结果是什么?

我如何编程,并可以解释我在做什么?

首先,你不能在Java中移动一个byte ,你只能移动一个intlong 。 所以这个byte会先进行升级,例如

00101011 – > 00000000000000000000000000101011

要么

11010100 – > 11111111111111111111111111010100

现在, x >> N表示(如果您将其视为一串二进制数字):

  • 最右边的N位被丢弃
  • 最左边的位被复制多次以将结果填充到原始大小(32或64位),例如,

00000000000000000000000000101011 >> 2 – > 00000000000000000000000000001010

11111111111111111111111111010100 >> 2 – > 11111111111111111111111111110101

移位运算符

00101011的二进制32位是

00000000 00000000 00000000 00101011 ,结果是:

  00000000 00000000 00000000 00101011 >> 2(times) \\ \\ 00000000 00000000 00000000 00001010 

将位43向左移动距离2; 在左侧填充最高(符号)位。

结果是十进制值为10的00001010。

 00001010 8+2 = 10 

当你右移2位时,你丢弃了2个最低有效位。 所以:

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

这与将整数除以2,2次实质上是一样的。

在Java中

 byte b = (byte) 16; b = b >> 2; // prints 4 System.out.println(b); 

这些例子涵盖了适用于正数和负数的三种class次:

 // Signed left shift on 626348975 00100101010101010101001110101111 is 626348975 01001010101010101010011101011110 is 1252697950 after << 1 10010101010101010100111010111100 is -1789571396 after << 2 00101010101010101001110101111000 is 715824504 after << 3 // Signed left shift on -552270512 11011111000101010000010101010000 is -552270512 10111110001010100000101010100000 is -1104541024 after << 1 01111100010101000001010101000000 is 2085885248 after << 2 11111000101010000010101010000000 is -123196800 after << 3 // Signed right shift on 626348975 00100101010101010101001110101111 is 626348975 00010010101010101010100111010111 is 313174487 after >> 1 00001001010101010101010011101011 is 156587243 after >> 2 00000100101010101010101001110101 is 78293621 after >> 3 // Signed right shift on -552270512 11011111000101010000010101010000 is -552270512 11101111100010101000001010101000 is -276135256 after >> 1 11110111110001010100000101010100 is -138067628 after >> 2 11111011111000101010000010101010 is -69033814 after >> 3 // Unsigned right shift on 626348975 00100101010101010101001110101111 is 626348975 00010010101010101010100111010111 is 313174487 after >>> 1 00001001010101010101010011101011 is 156587243 after >>> 2 00000100101010101010101001110101 is 78293621 after >>> 3 // Unsigned right shift on -552270512 11011111000101010000010101010000 is -552270512 01101111100010101000001010101000 is 1871348392 after >>> 1 00110111110001010100000101010100 is 935674196 after >>> 2 00011011111000101010000010101010 is 467837098 after >>> 3 

>>是算术右移运算符。 第一个操作数中的所有位移动了第二个操作数指定的位数。 结果中最左边的位被设置为与原始数字中最左边的位相同的值。 (这是负数保持负数。)

以下是您的具体情况:

 00101011 001010 <-- Shifted twice to the right (rightmost bits dropped) 00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number) 
 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 
 byte x = 51; //00101011 byte y = (byte) (x >> 2); //00001010 aka Base(10) 10 

你不能用Java编写像00101011这样的二进制文字,所以你可以用hex编写:

 byte x = 0x2b; 

要计算x >> 2的结果,您可以直接写出结果并打印结果。

 System.out.println(x >> 2); 

你可以使用例如这个API,如果你想看到你的数字的bitString表示。 罕见math

示例(在jruby中)

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

编辑 :更改api链接并添加一个小例子

00101011 = 43十进制

 class test { public static void main(String[] args){ int a= 43; String b= Integer.toBinaryString(a >> 2); System.out.println(b); } } 

输出:

101011变成1010