& 符号后跟 int.MaxValue 是否向下舍入?

Is ampersand followed by int.MaxValue rounding down?

我有一段 C# 代码是另一位开发人员从博客 post 复制的,用于 encode/obfuscate 一个整数。此代码包含一些我不熟悉的语法。看起来它可能会向下舍入计算结果以防止它超过整数的最大大小,如果是这种情况我担心两个输入值可能会导致相同的输出。混淆值必须是唯一的,所以我担心在不了解其工作原理的情况下使用此代码

这是代码的简化版本:

public static int DecodeNumber(int input)
{
    return (input * PrimeInverse) & int.MaxValue;
}

所以我的问题是 & 符号在此上下文中的含义是什么,此代码是否会产生对输入唯一的输出?

不,这里没有 "rounding"。这是一种在乘法导致溢出时截断最高有效位的偷偷摸摸的方法。

根据文档,int.MaxValue 是 2,147,483,647,即十六进制的 0x7FFFFFFF。对这个值执行按位与操作只会清除最高有效位。

由于代码的目的是使用 int.MaxValue 作为二进制模式,而不是使用 Int32 可以表示的最高 int 的数值,我建议显式使用 0x7FFFFFFF 常量,或使用 ~ 表达式 L

计算它
return (input * PrimeInverse) & ~(1 << 31);

& 符号是按位与运算符。该运算符两侧的数字将以二进制格式考虑,并且将对具有相同重要性的位执行逻辑与。 int.MaxValue 等于 2,147,483,647。此操作的结果解释如下:

操作:

a = x & int.MaxValue;

结果:

if (x >= 0) {a = x;}
if (x < 0) {a = x + 2,147,483,648;}

如果 x 是 non-negative 那么 a = x;

如果x为负数,则a = x + 2,147,483,648;

编辑:

逻辑运算:

ANDORXOR 等逻辑运算被定义为对布尔(逻辑)值起作用。布尔变量的值可以是 10。当且仅当两个变量都等于 1 时,两个逻辑变量之间 AND 运算的结果将是 1。如下所示:

0 & 0 = 0  
0 & 1 = 0  
1 & 0 = 0  
1 & 1 = 1  

数字的按位与运算符使用基本的 AND 运算符。首先将运算符两侧的两个数字转换为二进制格式。如果两个数字中的位数不相等,则将零添加到位数较少的数字的左侧,以使两个数字的位数相同。然后将相同意义的数字按上面解释的方式一位一位AND运算,每次运算的结果将写在构成结果的相同意义的地方。 127 之间的按位与如下所示。 12 在二进制格式中显示为 110070111.

12 = 0b1100    

7  = 0b0111    

12 & 7 = ?    

1 1 0 0 &    
0 1 1 1
----------  
0 1 0 0 = 4