【问题标题】:I want to understand the working of this Java program in detail? Why are we doing it and how are we taking such values to solve this?我想详细了解这个 Java 程序的工作原理?我们为什么要这样做,我们如何采用这样的价值观来解决这个问题?
【发布时间】:2021-08-13 07:17:33
【问题描述】:
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]);
    }
}

我不明白这里发生了什么

System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

以及为什么要服用 0xf1 和 0x0f。

【问题讨论】:

  • 你知道按位操作吗?如果没有,那将是一个很好的起点。
  • 我知道按位运算,但我仍然无法得到这个,为什么我们需要用 0x0f 右移后的数字,因为执行此操作后的结果是相同的,即 00001111。请帮助我理解这一点。

标签: java byte shift signed


【解决方案1】:

就像我在评论中所说的那样,您似乎没有清楚地了解按位运算的工作原理以及如何使用它们。我的建议是做一些按位运算的练习,这样你就知道如何使用它们了。不过,我会回顾一下这段代码在做什么?

这段代码在做什么?

此代码将存储在变量b 中的字节转换为十六进制形式。十六进制数组只允许我们将十进制转换为十六进制形式。这更像是一个中间步骤。

二进制转十进制?

假设我们有字节1010 1010。要将其转换为十六进制,我们可以参考二进制到十六进制表

我们知道1010 1010是A A,可以写成0xAA。

这段代码是如何工作的?

通过上面的转换,我们知道我们可以直接将4位转换成十六进制。代码也在做同样的事情。然而,我们面临的问题是我们如何准确地将二进制数一次转换为 4 位十六进制数。

这就是按位运算发挥作用的地方。它们允许我们相对轻松地切片、清除、设置、切换等。假设我们有一个十六进制 1000 1010

我们想要转换

1010 -> 一个

1000 -> 8

按位 AND 可以让我们清除某个位置的位。如果你和 1 位与,它保持不变。但是,如果您将其与 0 相加,则这些位将被清除。

第一步:转换1010

1000 1010
0000 1111 (0x0F)
---------
0000 1010 <- the MSB 4 bits are now cleared. This will allow us to convert the 1010 to hex easily

1010 是十进制的10,数组中的第十个元素是'A'。所以hex[10]给了A。

第二步:转换1000

如果我们只是简单地用0xF0 做一些明智的AND。我们得到的值是1000 0000,即-127,而不是8。我们需要以某种方式将其写入0000 1000,即8。这就是右移派上用场的地方。

1000 1010 >> 4
---------
1111 1000 <- result of shifting 4 times

现在,您可能想知道到底发生了什么。为什么转4次的结果不是0000 1000?

当位向右移动时,有符号位被扩展并取代被移位的位。这称为Arithmetic Shift,它发生在有符号字节上,而不是Logical Shift,它发生在无符号字节上。算术移位与逻辑移位非常相似,如果前导位为 0,则数字为正数。因此,现在要清除导致符号扩展的所有位,我们需要将数字与 0x0F 进行与运算

1111 1000
0000 1111 (0x0F)
---------
0000 1000 This is 8 in decimal and hex[8] gives us '8'

所以最后我们得到"0x" + "8" + "A",即"0x8A"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2021-01-01
    • 2022-11-30
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多