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?
答案 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
第一个班次为0
和1
的原因是因为有效位已经被移出。
如果你想获得最后一位,你需要(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