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

标签 c++ c hex bit-manipulation converters

有人可以解释一下它实际上是如何工作的,例如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);

如果输入时结果为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;

关于c++ - 使用位操作将十六进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376682/

相关文章:

c - 为什么我的 SelectionSort 并不总是有效?

c - 读取 fat16 img 文件内存位置的值

日期时间十六进制格式解密

c - 使用GTK+和开罗绘制线,而无需删除已经绘制的内容

c++ - 如何在继承类成员函数中访问基类成员的地址?

c++ - 延迟抓帧opencv

c++ - 友元类声明和成员函数声明

c - 链表 - C

ruby - 如何将十六进制字符串转换回二进制 'SecureRandom.random_bytes'?

c++ - 为什么 QueryInterface() 会在接口(interface)确实实现并且在 Windows 中具有内置编码器时失败?