繁体   English   中英

&符号后跟int.MaxValue四舍五入吗?

[英]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;

编辑:

逻辑运算:

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

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

数字上的按位AND运算符使用基本AND运算符。 首先,运算符两侧的两个数字转换为二进制格式。 如果两个数字中的位数不相等,则在数字的左侧添加零,使用较少的位数,以使两个数字具有相同的位数。 然后,按照上面解释的方式将具有相同重要性的数字逐一进行AND运算,并将每个运算的结果写在构造结果的具有相同意义的地方。 按位和127之间如下所示。 12以二进制格式表示为1100 ,而70111

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM