【问题标题】:Hex to Dec using bit-manipulation使用位操作的十六进制到十进制
【发布时间】:2016-01-27 09:04:46
【问题描述】:

有人可以解释一下这实际上是如何工作的,例如char input = 'a'。 我知道

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

这是我目前的理解:

char input = 'a' ascii 值为 97。加 9 为 106,二进制中的 106 为 01101010。0xf = 15 (00001111),因此 01101010 & 00001111 = 00001010,这给出了 10 的值,结果是附加到结果上。

提前致谢。

【问题讨论】:

  • 查看*str9 &amp; 0xf 处的值产生的位模式...
  • 搜索bit operatorsc。注意:我们可以告诉你,但你也必须付出一些努力。
  • 输入时result*str的值是多少?
  • 代码,用于将'a' 转换为'f''A' 转换为'F' 转换为10 转换为15 可以是result = result &lt;&lt; 4 | (*str -'a' + 10) &amp; 0xf;。这有帮助吗?它与... *str + 9 &amp; 0xf 相同,只是少了一点混淆。
  • 此代码已损坏,不适用于'0'...'9'。由于问题中缺乏上下文而被否决。

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


【解决方案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 之后,&amp; 0xf 操作清除了前 4 位,所以我们不需要担心这些。所以我们实际上只是将 9 添加到低 4 位。在a 的情况下,低4 位是1,所以加9 得到10,其他类似。

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

result = *str - 'a' + 10;

【讨论】:

  • @FelixPalmen 显然不是二进制的。固定。
  • 感谢您的回复,这是我的第一篇文章,如果我的问题不清楚,敬请见谅。认为我惹恼了一些人!
猜你喜欢
  • 2011-12-09
  • 2018-07-26
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多