我不明白“&”的功能在第一个例子中 我之前没有经历过这种回复陈述,请解释一下! 感谢
以下是一些功能的例子
uint hashToRange(int h) {return h & mask;}
// In this example mask is the data member of generic class
// These are some similar examples
bool lessIndex(intT a, intT b)
{
return 2 * hashToRange(a - b) > m;
}
inline int hashInt(unsigned int a) {
return hash(a) & (((unsigned) 1 << 31) - 1);
}
答案 0 :(得分:6)
运算符&
是一个按位AND运算符。在这种特殊情况下,它用于屏蔽32位数字中的符号位。
以下是它的工作原理:二进制中(unsigned) 1 << 31
的值是一个数字,其中第31位设置为1,所有剩余的位设置为零:
10000000 00000000 00000000 00000000
从中减去1
会产生一个数字,其中低31位设置为1
,符号位设置为零 * :
01111111 11111111 11111111 11111111
这将成为应用于hash(a)
的蒙版。当你对它执行按位AND时,你得到一个数字,其所有位都是hash(a)
,除了最重要的“符号”位,现在它被设置为零。
注意:此代码假设int
和unsigned
都是32位类型。该标准并不保证这是真的。更好的方法是使用int32_t
和uint32_t
类型来确保确切的大小。
* 同样的原则在这里起作用,当你从10000减去1并得到9999时。