十六进制到十二进制使用位操作

时间:2015-10-27 19:16:55

标签: c++ c hex bit-manipulation converter

有人可以解释一下这实际上是如何起作用的,例如char input = 'a'。 我明白了<<将位移位四位(对于多个字符)。但为什么在第二部分增加9?我知道0xf = 15 .....我错过了一些明显的东西。

result = result << 4 | *str + 9 & 0xf;

到目前为止,我的理解是:

字符输入=&#39; a&#39; ascii值为97.加9为106,二进制106为01101010. 0xf = 15(00001111),因此01101010&amp; 00001111 = 00001010,这给出值10,然后将结果附加到结果上。

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,让我们用括号重写它,使操作顺序更加清晰:

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;