发布于 2011-03-30 14:08:50
正如其他人所说,常量是十六进制形式的整数。具体来说,它是一个32位的十六进制整数.如果常量是有符号整数,则0x9e3779b9是负1640531527小数位的两种补码形式;因此,它可能是一个经过调整以处理两个相关问题的非积分的整数分数。
六角形中的二补体负正转换
0x9e3779b9 ⊕ 0xffffffff + 0x00000001 = 0x61C88647 = 1640531527 in decimal
或在C语言族中使用1's补运算符~
~0x9e3779b9 + 0x00000001 = 0x61C88647 = 1640531527 in decimal
二进制中的二补负数到正变换
10011110001101110111100110111001 ⊕ 11111111111111111111111111111111 + 00000000000000000000000000000001 = 01100001110010001000011001000111 = 1640531527 in decimal
发布于 2011-03-30 13:29:09
我认为StackOverflow的问题回答了这个问题:
https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine
从本质上说,它是一个神奇的数字,由黄金比率无理数派生而来,使用以下步骤:
phi = (1 + sqrt(5)) / 2 = 1,6180339887498948482045868343656
。2^32 / phi
,得到2 654 435 769,4972302964775847707926
。2 654 435 769
9E37 79B9
(在Windows上选择Qword
)由于它是一个预先计算的整数,而不是每次取一个浮点数并进行计算,而是加速了之后完成的每一个散列的演算。
符号0x
是一个十六进制数字,或者是16大本营。一个16基数的好处是,每一对数字精确地代表一个字节。经过一点练习,假设您曾经使用过二进制数,那么您几乎可以在脑海中看到位模式。
发布于 2015-07-05 09:05:47
数字来自黄金比率的十六进制表示。
正如小数点中的1/4
is 0.25
(25/100
)在十六进制中的0.4
(4/16
),黄金比率的小数部分在十六进制中有不同的表示形式。
您不是将0x9e3779b9
除以10^8
,而是将16^8
(或2/32
)和0x9e3779b9/0x100000000 = 2654435769/4294967296 ≈ 0.6180339886
除以
https://softwareengineering.stackexchange.com/questions/63595
复制相似问题