[英]Is ampersand followed by int.MaxValue rounding down?
我有一段C#代码,另一位开发人员从博客文章中复制了该代码,用于编码/混淆整数。 此代码包含一些我不熟悉的语法。 看起来它可能会使计算结果四舍五入以防止它超过整数的最大大小,如果是这种情况我担心两个输入值可能会导致相同的输出。 混淆的值必须是唯一的,因此我担心使用此代码而不了解它是如何工作的
这是代码的简化版本:
public static int DecodeNumber(int input)
{
return (input * PrimeInverse) & int.MaxValue;
}
所以我的问题是在这个上下文中&符号的含义是什么,这个代码会产生一个输入独有的输出吗?
不,这里没有“四舍五入”。 当乘法导致溢出时,这是截断最高有效位的偷偷摸摸的方式。
根据文档, int.MaxValue
是2,147,483,647,十六进制是0x7FFFFFFF
。 使用此值执行按位AND只会清除最高位。
由于代码的意图是使用int.MaxValue
作为其二进制模式,而不是其可以由Int32
表示的最高int
数值,我建议显式使用0x7FFFFFFF
常量,或者使用~
expressionL计算它。
return (input * PrimeInverse) & ~(1 << 31);
&符是一个按位AND运算符。 该运算符两侧的数字将以二进制格式考虑,逻辑AND将对具有相同意义的位执行。 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是非负的则a = x;
如果x为负数,则a = x + 2,147,483,648;
编辑:
逻辑运算:
像AND
, OR
, XOR
等逻辑运算被定义为处理布尔(逻辑)值。 布尔变量的值可以是1
或0
。 的结果AND
两个逻辑变量之间操作将是1
,当且仅当两个变量是等于1
。 如下所示:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
数字上的按位AND运算符使用基本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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.