我想详细了解这个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'