【问题标题】:Why is the magic number in boost::hash_combine specified in hex为什么 boost::hash_combine 中的幻数以十六进制指定
【发布时间】:2014-12-29 14:35:38
【问题描述】:

本例中的幻数是0x9e3779b9,以10为底是2654435769。代码有什么原因吗

seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); 

使用十六进制表示而不是 base-10 表示?如果将代码中的 0x9e3779b9 替换为 2654435769,功能会保持不变吗?

【问题讨论】:

标签: c++ boost hash


【解决方案1】:

字面量是字面量,同一字面量的不同表示是……字面上相同。

但是,表达式(文字或非文字)也有一个类型

等效的文字应该是2654435769u(注意类型后缀是unsigned)。

看看这个简单的测试Live On Coliru

  • 0x9e3779b9 具有类型 unsigned int(32 位)和
  • 2654435769 的类型为 long(64 位)
  • 2654435769u 再次具有 unsigned int(32 位)类型

如您所见,十六进制表示支持无符号,十进制表示支持有符号,从而使类型更大¹。


¹ 本机整数大小由实现定义

(除了类型之外,有人可能会争辩说,位分布在十六进制、八进制或最终二进制表示中可能更明显)

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 2011-02-09
    • 2015-11-07
    • 1970-01-01
    • 2010-09-19
    • 2011-07-02
    相关资源
    最近更新 更多