繁体   English   中英

如何从Javascript代码在C#中进行十进制按位运算

[英]How to do decimal Bitwise Operation in C# from Javascript's Code

我正在将库从javascript转换为C#,并在这种情况下感到:

// Javascript
var number = 3144134277.518717 | 0;
console.log(number); // -> -1150833019

从我在其他文章上读到的内容来看,它可能曾被用于舍入值,但是在这种情况下,值不是我期望的值(如果要舍入),并且我无法在C#中复制相同的值行为:

// C#
3144134277.5187168 | 0 // -> Operator '|' cannot be applied to operands 
                       //    of type 'double' and 'int'
// or
Convert.ToInt64(3144134277.5187168) | 0 // -> 3144134278

谢谢你的帮助!

方式| 规范中详细介绍在JavaScript中可以使用的脚本 ,但是首先您看到的是| 在执行按位OR之前将其操作数隐式转换为32位int(这是空操作,因为第二个arg为0 )。 所以,实际上您看到的是ToInt32操作的结果:

  1. 让数字成为? ToNumber(argument) (您可以在很大程度上忽略此位。)
  2. 如果number为NaN+0-0+∞-∞ ,则返回+0
  3. int为与number相同的符号,其大小为floor(abs(number))的数学值。
  4. int32bitint模2 ^ 32
  5. 如果int32bit≥2 ^ 31 ,则返回int32bit -2 ^ 32 ; 否则返回int32bit

因此,在C#中,我认为大约是:

double value = 3144134277.5187168;
bool negative = value < 0;
long n = Convert.ToInt64(Math.Floor(Math.Abs(value)));
n = n % 4294967296;
n = n > 2147483648 ? n - 4294967296 : n;
int i = (int)n;
i = negative ? -i : i;
Console.WriteLine(i); // -1150833019

为清晰起见而详细写成的 请注意,符号不会在与规范完全相同的位置添加回结果中; 当我这样做时,它不能正常工作,这可能与规范的“模”和C#的%运算符之间的定义不同有关。

只需-3144134277.5187168检查,使用-3144134277.5187168那些步骤-3144134277.5187168为您提供1150833019 ,这也是应该的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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