移位位值

时间:2014-03-13 17:23:54

标签: java bit-shift bits

String message = "1";
        byte[] bytes = message.getBytes();

        System.out.println(bytes[0] + ": ");
        for (int i = 0; i < 8; i++) {
            System.out.print((bytes[0] >> (7 - i)) + " ");
        }

Output: 49: 
0 0 1 3 6 12 24 49

所以我的字符串是1,其中ASCII为49。我想要理解的是为什么我的位有值3,6,12,24和49?背后发生了什么,为什么他们不像前三个一样只有0和1?

5 个答案:

答案 0 :(得分:4)

二进制49是

110001

您将此相同的值移动7, 6, 5, 4, ..., (7 - i)位。

所以

00110001 >> 7 ==> 00000000 == 0
00110001 >> 6 ==> 00000000 == 0
00110001 >> 5 ==> 00000001 == 1
00110001 >> 4 ==> 00000011 == 3
...

您可以使用Integer.toBinaryString(int)将整数值的二进制表示形式设为String

答案 1 :(得分:2)

因为您的位提取​​不正确。字符'1'的位代表是49的代码:00110001

您正在移动7次,然后是6次,然后是5次等,但是您没有正确地隔离这些位。

00110001 >> 7 is 00000000 or 0
00110001 >> 6 is 00000000 or 0
00110001 >> 5 is 00000001 or 1
00110001 >> 4 is 00000011 or 3
00110001 >> 3 is 00000110 or 6
00110001 >> 2 is 00001100 or 12
00110001 >> 1 is 00011000 or 24
00110001 >> 0 is 00110001 or 49

你必须按位进行 - 并使用1来隔离你移动的位以获得1和0。

System.out.print( ((bytes[0] >> (7 - i)) & 1) + " ");

输出:

49: 
0 0 1 1 0 0 0 1 

答案 2 :(得分:1)

二进制数字49的最后8位如下所示:

00110001

当您将数字右移k位时,它与将int除以2 k 的数字相同。这就是你在输出中得到的结果(|右边的数字被删除):

0 | 0110001 -- 0
00 | 110001 -- 0
001 | 10001 -- 1
0011 | 0001 -- 3
00110 | 001 -- 6
001100 | 01 -- 12
0011000 | 1 -- 24
00110001 |  -- 49

答案 3 :(得分:0)

移位时,您将位n位置移位(在本例中为右侧)。

所以:

Loop#    7-i     bits      result
0        7      000000000   0
1        6      000000000   0
2        5      000000001   1
3        4      000000011   3
4        3      000000110   6
5        2      000001100  12
6        1      000011000  24
7        0      000110001  49

第一个班次为01的原因是因为有效位已经被移出。

如果你想获得最后一位,你需要(a>>s)&1 a数字,s你想要的位。{/ p>

如果您要打印a的二进制表示,只需使用Integer.toBinaryString(a);

答案 4 :(得分:0)

您的实际数据可能是49但是,它需要为字节数据类型填充8位。因此,如果您从0到7计算8位(根据您的循环)。并且您正在使用>>这将是正确的转变。

49 binary is  0 0 1 1 0 0 0 1

0 0 1 1 0 0 0 1  >> 7-0 = 00000000 = 0
0 0 1 1 0 0 0 1  >> 7-1 = 00000000 = 0
0 0 1 1 0 0 0 1  >> 7-2 = 00000001 = 1
0 0 1 1 0 0 0 1  >> 7-3 = 00000011 = 3
0 0 1 1 0 0 0 1  >> 7-4 = 00000110 = 6
0 0 1 1 0 0 0 1  >> 7-5 = 00001100 = 12
0 0 1 1 0 0 0 1  >> 7-6 = 00011000 = 32
0 0 1 1 0 0 0 1  >> 7-7 = 00110001 = 49