无符号长按位运算符?

时间:2012-03-18 20:17:01

标签: c++ variables operators bit-manipulation long-integer

我目前正在使用哈希函数:

unsigned long hashFunc(const char *str, unsigned int tablesize ) // djb2 hash
{   
    unsigned long hash = 5381;
    int c;
    while (c = *str++)
        hash = ((hash << 5) + hash)+ c; /* hash * 33 + c */

    return (hash & tablesize)-1;
}

显然,按位运算符&amp;对于某些长值失败并返回long的最大值。例如,用表大小为63的“care”一词进行哈希处理会返回0xffffffff。

按位运算符是否打算用于无符号长整数?如果是这样,我还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

你需要在括号内加上“-1”:

return (hash & (tablesize - 1));

这只有在知道tableize是2的幂时才有效。

如果tablesize不是2的幂,那么你应该使用模运算符“%”:

return hash % tablesize;

(在这种情况下不需要“-1”)。

答案 1 :(得分:0)

这两种类型 - unsigned intunsigned long可能具有不同的大小,这可能会导致按位操作执行您不期望的操作。 尝试投射:

return (hash & (unsigned long)tablesize)-1;

(或使用static_cast,如果你坚持的话)

答案 2 :(得分:0)

我测试了一下,它似乎工作得很好。 简单地说,运气不好 - hash ("care",63)的价值是0x17c9504c0,当你执行二元时 - 0x3f你得到的是0。减去1并且你得到0xffffffffffffffff

问题在于您的代码,而不在机器中:)