Mar*_*mme 2 javascript c# bit-manipulation bitwise-operators
我正在将一个库从javascript翻译成C#,在这种情况下感觉:
// Javascript
var number = 3144134277.518717 | 0;
console.log(number); // -> -1150833019
Run Code Online (Sandbox Code Playgroud)
从我在其他帖子上看到的内容来看,它可能用于舍入值,但在这种情况下,值不是我期望的值(如果它是舍入的)并且我不能在C#中重现行为:
// C#
3144134277.5187168 | 0 // -> Operator '|' cannot be applied to operands
// of type 'double' and 'int'
// or
Convert.ToInt64(3144134277.5187168) | 0 // -> 3144134278
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
规范中|详细介绍了javaScript中的工作方式,但主要是您所看到的是在执行按位OR之前将其操作数隐式转换为32位整数(由于第二个arg是无操作).所以你真正看到的是操作的结果:|0ToInt32
ToNumber(argument).(你可以在很大程度上忽略这一点.)NaN,+0,-0,+?,或-?,返回+0.floor(abs(number)).所以在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
Run Code Online (Sandbox Code Playgroud)
...为了清楚起见,请详细说明.请注意,符号不会添加回与规范完全相同的结果; 当我这样做时,它没有正常工作,这可能与规范的"模数"和C#%运算符之间的不同定义有关.
只需仔细检查,这些步骤就可以-3144134277.5187168给你1150833019,这也应该是你应该做的.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |