C对按位移位操作感到困惑

时间:2017-05-17 08:44:32

标签: c bitwise-operators

在我正在阅读的一本书中,有一个哈希函数,如下所示

static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength)
{
    register ulong hash = 5381;

    for (uint i = 0; i < nKeyLength; ++i) {
        hash = ((hash << 5) + hash) + arKey[i];
    }
    return hash;
}
  

hash << 5 + hash表达式与hash * 32 + hashhash * 33相同。

我理解为什么hash << 5 + hashhash * 32 + hash相同,但它如何成为hash * 33是我不理解的。 我试图推断hash * 32溢出并包装成为模2 ^ n操作,但显然不是因为a)hash属于ulong类型 这足以容纳hash *32表达式的结果。 b)即使unint仍然很大,因为有问题的乘法会溢出 拥有更多C知识的人可以通过简单的解释帮助我,甚至可能指出我的困惑的根源。 谢谢你。

1 个答案:

答案 0 :(得分:2)

这与C语言无关,而与数学有关。

  

哈希&lt;&lt; 5 + hash表达式与hash * 32 + hash或hash * 33相同。

基本代数陈述这些事情是真的(这些是用C语言写的):

/* #1 */ (a * b + a * c) == (a * (b + c))
/* #2 */ (a) == (a * 1)

应用#2,我们可以说:

(hash * 32 + hash) == (hash * 32 + hash * 1)

现在应用#1,我们可以找到:

(hash * 32 + hash * 1) == (hash * (32 + 1))

这可以简化为:

hash * 33

这是基础数学,但也许你累了或过度工作,只是看不出它是如何工作的:)