c - 哈希函数中的 get16bits 宏

标签 c hash

前几天我在研究哈希函数,发现一个网站上有一个例子。大部分代码很容易掌握,但是这个宏函数我无法真正理解。

有人能解释一下这里发生了什么吗?

#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))

最佳答案

基本上它获取32位整数d的低16位

让我们分解一下

#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) +(uint32_t)(((const uint8_t *)(d))[0]))
uint32_t a = 0x12345678;
uint16_t b = get16bits(&a); // b == 0x00005678

首先我们必须将 a 的地址传递给 get16bits() 否则它将不起作用。

(((uint32_t)(const uint8_t *)(d))[1])) << 8

这首先将 32 位整数转换为 8 位整数数组并检索 2 位整数。 然后将值移动 8 位,并将低 8 位添加到其中

+ (uint32_t)(((const uint8_t *)(d))[0]))

在我们的示例中,它将是

uint8_t tmp[4] = (uint8_t *)&a;
uint32_t result;
result = tmp[1] << 8; // 0x00005600
result += tmp[0]; //tmp[0] == 0x78
// result is now 0x00005678

关于c - 哈希函数中的 get16bits 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603462/

相关文章:

c++ - 是否有标准机制来检索 C 字符串的哈希值?

java - 如何同时在两个数组中找到相同的 byte[]-objects?

c - 将二维数组传递给 C 函数的方法

c - 在 32 位 Debian Squeeze 下编译的 C 程序导致我 friend 的 64 位程序出现段错误

c++ - eventfd_read/write 与 sem_wait/post

c - 为什么段错误和程序以退出代码 139 结束?

javascript - JS骗我吗?想要在 C 中实现与 Javascript 中相同的哈希值

ruby - 使用数据库中的记录更新哈希数组,将新字段添加到每个现有哈希中

python - Cython:编译并找不到库 Mac OSX 10.12

c - 如何从磁盘来回保存和加载一个巨大的哈希表?