我想详细了解这个Java程序的工作原理?我们为什么要这样做?我们如何利用这些价值观来解决这个问题?
我不明白这里发生了什么我想详细了解这个Java程序的工作原理?我们为什么要这样做?我们如何利用这些价值观来解决这个问题?,java,byte,shift,signed,Java,Byte,Shift,Signed,我不明白这里发生了什么 class shift_right { public static void main(String args[]) { char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; byte b = (byte) 0xf1; System.out.println("b = 0x" + hex[(b
class shift_right {
public static void main(String args[]) {
char hex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
为什么要使用0xf1和0x0f呢?正如我在评论中所说的那样,您似乎对按位操作的工作原理以及如何使用它们没有清晰的理解。我的建议是做一些关于位运算的练习,这样你就知道如何使用它们了。尽管如此,我还是要检查一下这段代码在做什么 这段代码在做什么? 此代码将存储在变量
b
中的字节转换为十六进制形式。十六进制数组只允许我们将十进制形式转换为十六进制形式。这更像是一个中间步骤
二进制到十进制?
假设我们有字节10101010
。要将其转换为十六进制,我们可以参考二进制到十六进制表
我们知道10101010
是A
,可以写成0xAA
这段代码是如何工作的?
通过上面的转换,我们知道我们可以直接将4位转换成十六进制。代码也在做同样的事情。然而,我们面临的问题是,如何准确地获取二进制数,并一次将其转换为十六进制4位
这就是按位操作发挥作用的地方。他们允许我们切片,清除,设置,切换等。。。相对容易地咬。假设我们有一个十六进制1000 1010
我们想改变信仰
1010
->A
1000
->8
位智能,允许我们在特定位置清除位。如果您使用1和一个位,它将保持不变。但是,如果您使用0和它。那些碎片被清除了
步骤1:转换1010
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
现在,你可能想知道刚才到底发生了什么。为什么移位4次的结果不是0000 1000
当位向右移位时,有符号位被扩展并取代移位的位。这被称为有符号字节,而无符号字节则相反。如果前导位为0,则数字为正,则算术移位与逻辑移位非常相似。所以,现在要清除导致符号扩展的所有位,我们需要使用0x0F和数字
1000 1010 >> 4
---------
1111 1000 <- result of shifting 4 times
最后我们得到了
“0x”+“8”+“A”
,也就是“0x8A”
您知道位操作吗?如果没有,那么这将是一个很好的起点。我知道逐位运算,但我仍然不能得到这个结果,为什么我们需要使用0x0f右移位后的数字,因为执行此运算后的结果是相同的,即00001111。请帮助我理解这一点。
1000 1010 >> 4
---------
1111 1000 <- result of shifting 4 times
1111 1000
0000 1111 (0x0F)
---------
0000 1000 This is 8 in decimal and hex[8] gives us '8'