如何使 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)。
之后,您可以将结果转换为 int
或 uint
。 uint
是无符号的,因此可以保证该值可以存储在 uint
中。但是,uint
不能用于负数。
我正在尝试将一些 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)。
之后,您可以将结果转换为 int
或 uint
。 uint
是无符号的,因此可以保证该值可以存储在 uint
中。但是,uint
不能用于负数。