首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TEA算法常数0x9e3779b9据说是由黄金比率导出的,但黄金数是1.618?

TEA算法常数0x9e3779b9据说是由黄金比率导出的,但黄金数是1.618?
EN

Software Engineering用户
提问于 2011-03-30 13:13:55
回答 4查看 12K关注 0票数 6

我试图理解一个常数0x9e3779b9。

这是什么数据?不是二进制,不是十进制,这是什么?

这是TEA算法中使用的常量。它说它是从黄金数派生出来的,但是黄金数字是1.618?

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2011-03-30 14:08:50

正如其他人所说,常量是十六进制形式的整数。具体来说,它是一个32位的十六进制整数.如果常量是有符号整数,则0x9e3779b9是负1640531527小数位的两种补码形式;因此,它可能是一个经过调整以处理两个相关问题的非积分的整数分数。

六角形中的二补体负正转换

代码语言:javascript
运行
复制
0x9e3779b9 ⊕ 0xffffffff + 0x00000001 = 0x61C88647 = 1640531527 in decimal

或在C语言族中使用1's补运算符~

代码语言:javascript
运行
复制
~0x9e3779b9 + 0x00000001 = 0x61C88647 = 1640531527 in decimal 

二进制中的二补负数到正变换

代码语言:javascript
运行
复制
10011110001101110111100110111001 ⊕ 11111111111111111111111111111111 + 00000000000000000000000000000001 =  01100001110010001000011001000111 = 1640531527 in decimal
票数 9
EN

Software Engineering用户

发布于 2011-03-30 13:29:09

我认为StackOverflow的问题回答了这个问题:

https://stackoverflow.com/questions/4948780/magic-numbers-in-boosthash-combine

从本质上说,它是一个神奇的数字,由黄金比率无理数派生而来,使用以下步骤:

  1. phi = (1 + sqrt(5)) / 2 = 1,6180339887498948482045868343656
  2. 在此基础上,计算出2^32 / phi,得到2 654 435 769,4972302964775847707926
  3. 截断它,使其只有整数部分2 654 435 769
  4. 将其转换为十六进制,您将得到9E37 79B9 (在Windows上选择Qword)

由于它是一个预先计算的整数,而不是每次取一个浮点数并进行计算,而是加速了之后完成的每一个散列的演算。

符号0x是一个十六进制数字,或者是16大本营。一个16基数的好处是,每一对数字精确地代表一个字节。经过一点练习,假设您曾经使用过二进制数,那么您几乎可以在脑海中看到位模式。

票数 36
EN

Software Engineering用户

发布于 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除以

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/63595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档