从Javascript's代码中学习如何在c#中进行十进制按位运算
本文关键字:十进制 运算 Javascript 学习 代码 | 更新日期: 2023-09-27 18:15:21
我正在把一个库从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中的工作方式在规范中有详细说明,但您主要看到的是|
在执行按位或之前隐式地将其操作数转换为32位整数(这是无操作,因为第二个参数是0
)。所以你真正看到的是ToInt32
操作的结果:
- 让数字是?
ToNumber(argument)
。(你可以忽略这一点) - 如果number为
NaN
、+0
、-0
、+∞
、-∞
,返回+0
- 设int为与数字同号、星等为
floor(abs(number))
的数学值。 - 让 int32bit int 是模2 ^ <一口> 32 一口>。
- 如果 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
…为了清晰而写得冗长的。请注意,该符号不会在与spec完全相同的位置添加到结果中;当我这样做时,它不能正常工作,这可能与规范中的"modulo"和c#的%
运算符之间的不同定义有关。
再检查一下,-3144134277.5187168
的这些步骤会给你1150833019
,这也是应该的。