GetHashCode(key) & int.MaxValue

本文关键字:int MaxValue amp key GetHashCode | 更新日期: 2023-09-27 18:21:29

在浏览mscorlib.dll中通用Dictionary<TKey, TValue>类的实现时,我注意到以下内容多次用于获取哈希密钥:

int num = this.comparer.GetHashCode(key) & int.MaxValue;

GetHashCode()返回一个int。我错误地认为int。MaxValue和任何整数x之间的逐位AND总是会返回x吗?

有人能解释一下为什么&运算符是否以上述方式使用?

GetHashCode(key) & int.MaxValue

int.MaxValue的值为0x7FFFFFFF——最高有效位为零。因此,当您使用另一个int执行逐位运算时,您实际上将"sign"位清零。注意,由于使用了二者的补码编码,-1不会变成1,而是2147483647。

显然,由于某些原因,代码示例中的num变量中只允许使用正整数。

它不会影响正数

  • [0,int.MaxValue]->保持不变
  • [int.MinValue,-1]-->将更改符号位