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