使用位操作将十六进制转换为十进制

Hex to Dec using bit-manipulation

本文关键字:转换 十进制 十六进制 位操作      更新时间:2023-10-16

有人能解释一下这是如何实际工作的吗?例如char input = 'a'。我理解<lt;将位移四位(对于一个以上的字符)。但是为什么在第二部分加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位,所以我们不需要担心这些。所以我们实际上只是在较低的4位上加9。在a的情况下,较低的4位是1,所以加9可以得到10,其他的也一样。

正如chux在评论中提到的,实现这一目标的更直接的方法如下:

result = *str - 'a' + 10;