如何在C#中从Java代码中实现十进制位运算

How to do decimal Bitwise Operation in C# from Javascript#39;s Code(如何在C#中从Java代码中实现十进制位运算)
本文介绍了如何在C#中从Java代码中实现十进制位运算的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将一个库从Java脚本转换为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

谢谢您的帮助!

推荐答案

|in the spec详细介绍了|的工作方式,但您主要看到的是|在执行按位或之前隐式地将其操作数转换为32位整数(这是一个无操作,因为第二个参数是0)。您所看到的确实是ToInt32 operation:

的结果
  1. 设数字为?ToNumber(argument)(您基本上可以忽略这一点。)
  2. 如果number为NaN+0-0+∞-∞,则返回+0
  3. int为与数字符号相同且大小为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的这些步骤就会得到1150833019,这也是理应如此。

这篇关于如何在C#中从Java代码中实现十进制位运算的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)