在Java中如何移位工作?
我有这样的说法:
假设字节
x
的位值是00101011.x>>2
的结果是什么?
我如何编程,并可以解释我在做什么?
首先,你不能在Java中移动一个byte
,你只能移动一个int
或long
。 所以这个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