使用位操作的十六进制到十进制
Hex to Dec using bit-manipulation
有人可以解释一下这实际上是如何工作的,例如 char input = 'a'
。
我知道 << 将位移动了四个位置(超过一个字符)。但为什么在第二部分中添加 9?我知道 0xf = 15.....我是不是漏掉了一些明显的东西。
result = result << 4 | *str + 9 & 0xf;
这是我目前的理解:
char input = 'a' ascii值是97。加9是106,106二进制是01101010。0xf = 15(00001111),所以01101010 & 00001111 = 00001010,这给出了10的值和然后将结果附加到结果中。
提前致谢。
首先,让我们用括号重写一下,使操作顺序更清楚:
result = (result << 4) | ((*str + 9) & 0xf);
如果 result
输入为 0,则我们有:
result = (0 << 4) | ((*str + 9) & 0xf);
简化为:
result = (0) | ((*str + 9) & 0xf);
再一次:
result = (*str + 9) & 0xf;
现在让我们看看 a
- f
:
的十六进制和二进制表示
a = 0x61 = 01100001
b = 0x62 = 01100010
c = 0x63 = 01100011
d = 0x64 = 01100100
e = 0x65 = 01100101
f = 0x66 = 01100110
加 9 后,& 0xf
操作会清除前 4 位,因此我们无需担心这些。所以我们实际上只是将 9 添加到低 4 位。在 a
的情况下,低 4 位是 1
,因此加 9 得到 10
,其他类似。
正如 chux 在他的评论中提到的,更直接的实现方式如下:
result = *str - 'a' + 10;
有人可以解释一下这实际上是如何工作的,例如 char input = 'a'
。
我知道 << 将位移动了四个位置(超过一个字符)。但为什么在第二部分中添加 9?我知道 0xf = 15.....我是不是漏掉了一些明显的东西。
result = result << 4 | *str + 9 & 0xf;
这是我目前的理解:
char input = 'a' ascii值是97。加9是106,106二进制是01101010。0xf = 15(00001111),所以01101010 & 00001111 = 00001010,这给出了10的值和然后将结果附加到结果中。
提前致谢。
首先,让我们用括号重写一下,使操作顺序更清楚:
result = (result << 4) | ((*str + 9) & 0xf);
如果 result
输入为 0,则我们有:
result = (0 << 4) | ((*str + 9) & 0xf);
简化为:
result = (0) | ((*str + 9) & 0xf);
再一次:
result = (*str + 9) & 0xf;
现在让我们看看 a
- f
:
a = 0x61 = 01100001
b = 0x62 = 01100010
c = 0x63 = 01100011
d = 0x64 = 01100100
e = 0x65 = 01100101
f = 0x66 = 01100110
加 9 后,& 0xf
操作会清除前 4 位,因此我们无需担心这些。所以我们实际上只是将 9 添加到低 4 位。在 a
的情况下,低 4 位是 1
,因此加 9 得到 10
,其他类似。
正如 chux 在他的评论中提到的,更直接的实现方式如下:
result = *str - 'a' + 10;