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

时间:2016-10-28 15:56:52

标签: javascript c# bit-manipulation bitwise-operators

我正在将一个库从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

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

|在javaScript中的工作方式详细in the spec,但主要是你看到|在按位进行之前隐式将其操作数转换为32位整数OR(这是一个无操作,因为第二个arg是0)。所以你真正看到的是ToInt32 operation

的结果
  1. 让号码成为? ToNumber(argument)(你可以在很大程度上忽略这一点。)
  2. 如果号码为NaN+0-0+∞-∞,请返回+0
  3. int 为与数字相同的数学值,其大小为floor(abs(number))
  4. int32bit int modulo 2 ^ 32
  5. 如果 int32bit ≥2^ 31 ,则返回 int32bit - 2 ^ 32 ;否则返回 int32bit
  6. 所以在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
    

    ...为了清楚起见,详细说明。请注意,该符号不会与规范完全相同的位置添加回结果;当我这样做时,它没有正常工作,这可能与规范&#34; modulo&#34;之间的不同定义有关。和C#&#39; %运营商。

    只需仔细检查,-3144134277.5187168的这些步骤会为您提供1150833019,这也应该是正确的。