& 符号后跟 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;
编辑:
逻辑运算:
AND
、OR
、XOR
等逻辑运算被定义为对布尔(逻辑)值起作用。布尔变量的值可以是 1
或 0
。当且仅当两个变量都等于 1
时,两个逻辑变量之间 AND
运算的结果将是 1
。如下所示:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
数字的按位与运算符使用基本的 AND
运算符。首先将运算符两侧的两个数字转换为二进制格式。如果两个数字中的位数不相等,则将零添加到位数较少的数字的左侧,以使两个数字的位数相同。然后将相同意义的数字按上面解释的方式一位一位AND
运算,每次运算的结果将写在构成结果的相同意义的地方。 12
和 7
之间的按位与如下所示。 12
在二进制格式中显示为 1100
而 7
是 0111
.
12 = 0b1100
7 = 0b0111
12 & 7 = ?
1 1 0 0 &
0 1 1 1
----------
0 1 0 0 = 4
我有一段 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;
编辑:
逻辑运算:
AND
、OR
、XOR
等逻辑运算被定义为对布尔(逻辑)值起作用。布尔变量的值可以是 1
或 0
。当且仅当两个变量都等于 1
时,两个逻辑变量之间 AND
运算的结果将是 1
。如下所示:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
数字的按位与运算符使用基本的 AND
运算符。首先将运算符两侧的两个数字转换为二进制格式。如果两个数字中的位数不相等,则将零添加到位数较少的数字的左侧,以使两个数字的位数相同。然后将相同意义的数字按上面解释的方式一位一位AND
运算,每次运算的结果将写在构成结果的相同意义的地方。 12
和 7
之间的按位与如下所示。 12
在二进制格式中显示为 1100
而 7
是 0111
.
12 = 0b1100
7 = 0b0111
12 & 7 = ?
1 1 0 0 &
0 1 1 1
----------
0 1 0 0 = 4