在返回表达式中奇怪地使用 & 运算符

Strange use of the & operator in a return expression

本文关键字:运算符 返回 表达式      更新时间:2023-10-16

我不明白第一个例子中"&"的功能我以前没有在c中遇到过这种返回语句,请解释一下!谢谢

下面是一些函数的示例

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);
    }

运算符 & 是按位 AND 运算符。在这种特殊情况下,它用于屏蔽 32 位数字中的符号位。

以下是它的工作原理:二进制中的 (unsigned) 1 << 31 值是一个数字,其中位 31 设置为 1,所有剩余位设置为零:

10000000 00000000 00000000 00000000

从中减去1会产生一个数字,其中较低的 31 位设置为 1,符号位设置为零*

01111111 11111111 11111111 11111111

这将成为应用于hash(a)的蒙版。当您对其执行按位 AND 时,您最终会得到一个数字,该数字包含除最高有效"符号"位(现在设置为零(之外的所有hash(a)位。

注意:此代码假设intunsigned都是 32 位类型。该标准不保证这是真的。更好的方法是使用int32_tuint32_t类型来确保确切的大小。

* 这里的工作原理与从 1 中减去 10000 并得到 9999 的情况相同。