我有这样的声明:
假设字节
x
的位值为00101011.x>>2
的结果是什么?
我如何编程并且有人可以解释我在做什么?
答案 0 :(得分:92)
首先,你可以不在java中移动byte
,你只能移动int
或long
。因此,byte
将首先进行促销,例如
00101011
- > 00000000000000000000000000101011
或
11010100
- > 11111111111111111111111111010100
现在,x >> N
表示(如果您将其视为二进制数字字符串):
00000000000000000000000000101011 >> 2
- > 00000000000000000000000000001010
11111111111111111111111111010100 >> 2
- > 11111111111111111111111111110101
答案 1 :(得分:55)
00101011
的二进制32位是
00000000 00000000 00000000 00101011
,结果是:
00000000 00000000 00000000 00101011 >> 2(times)
\\ \\
00000000 00000000 00000000 00001010
将位43向右移动距离2;填充左侧最高(符号)位。
结果为00001010,十进制值为10。
00001010
8+2 = 10
答案 2 :(得分:16)
右移2位时,丢弃2个最低有效位。所以:
x = 00101011
x >> 2
// now (notice the 2 new 0's on the left of the byte)
x = 00001010
这与将int分为2次2基本相同。
在Java中
byte b = (byte) 16;
b = b >> 2;
// prints 4
System.out.println(b);
答案 3 :(得分:10)
这些例子涵盖了应用于正数和负数的三种类型的转变:
// 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
答案 4 :(得分:5)
>>
是算术右移运算符。第一个操作数中的所有位都移位了第二个操作数指示的位数。结果中最左边的位设置为与原始数字中最左边的位相同的值。 (这是负数仍为负数。)
以下是您的具体案例:
00101011
001010 <-- Shifted twice to the right (rightmost bits dropped)
00001010 <-- Leftmost bits filled with 0s (to match leftmost bit in original number)
答案 5 :(得分:4)
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
答案 6 :(得分:2)
你不能在Java中编写像00101011
这样的二进制文字,所以你可以用十六进制编写它:
byte x = 0x2b;
要计算x >> 2
的结果,您可以准确地写出并打印结果。
System.out.println(x >> 2);
答案 7 :(得分:2)
byte x = 51; //00101011
byte y = (byte) (x >> 2); //00001010 aka Base(10) 10
答案 8 :(得分:2)
您可以使用例如如果您想查看数字的bitString表示,请使用此API。 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链接并添加了一些示例
答案 9 :(得分:0)
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