如何使 c# 和 javascript 中的异或结果相等

How to make xor result equal in c# and javascript

我正在尝试将一些 javascript 代码转换为 C# 代码。在某些时候,在 javascript 中,我有这样的表达式:

var result = 8797569417216^909522486;

结果变量然后包含值 1849046582。我听说 javascript 使用 32 位数字作为按位运算符,但我不知道如何使用此信息在 c# 中获得相同的结果。当我运行同一行代码时,结果包含8797942068790.

我错过了什么?

您可以将结果转换为int:

var result = 8797569417216^909522486;
var realResult = unchecked((int) result);

注意未选中的,因为你的值明显大于 Int32。

问题是 8797942068790 不能用 32 位表示,因此 C# 将其处理为 64 位。但是,您可以使用以下方法将 (value-wise) 转换回 32 位:

x & ((1L<<32)-1)

其工作原理如下。 1L 表示您使用 64 位 long 表示 1。接下来将它向左移动 32 个位置。这意味着您获得的值刚好高于 32 位的最大可表示数。通过减去 1,所有 32 个最低位都为 1,所有其他位为零,因此:((1L<<32)-1) 的二进制等于:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111

现在,通过使用按位 &,您可以屏蔽所有不能用 32 位表示的值。

因此对于您的示例,这意味着:

csharp> (8797569417216^909522486)&((1L<<32)-1)
1849046582

(使用了 csharp 交互式 shell)。

之后,您可以将结果转换为 intuintuint 是无符号的,因此可以保证该值可以存储在 uint 中。但是,uint 不能用于负数。