如何在c#和javascript中使xor结果相等
我正在尝试将一些javascript代码转换为c代码。在javascript中,我有这样一个表达式:如何在c#和javascript中使xor结果相等,javascript,c#,xor,Javascript,C#,Xor,我正在尝试将一些javascript代码转换为c代码。在javascript中,我有这样一个表达式: var result = 8797569417216^909522486; 然后,结果变量包含值1849046582。我听说javascript使用32位数字作为位运算符,但我不知道如何使用这些信息在c#中获得相同的结果。当我运行同一行代码时,结果包含8797942068790 我缺少什么?您可以将结果转换为int: var result = 8797569417216^909522486;
var result = 8797569417216^909522486;
然后,结果变量包含值1849046582。我听说javascript使用32位数字作为位运算符,但我不知道如何使用这些信息在c#中获得相同的结果。当我运行同一行代码时,结果包含8797942068790
我缺少什么?您可以将结果转换为
int
:
var result = 8797569417216^909522486;
var realResult = unchecked((int) result);
请注意未选中,因为您的值明显大于Int32。问题在于
8797942068790
不能用32位表示,因此C#将其处理为64位。但是,您可以使用以下方法将(按值)转换回32位:
x & ((1L<<32)-1)
现在,通过使用逐位&
,可以屏蔽所有不能用32位表示的值
以你的例子来说,这意味着:
csharp> (8797569417216^909522486)&((1L<<32)-1)
1849046582
csharp>(8797569417216^909522486)和((1)你想要相同的结果吗?你得到的结果是错误的-c#给出了正确的值…附录:不要忘记JavaScript(9007199254740991)中的最大安全整数,在这个值之后,结果会不同,因为JS中的数字是以浮点形式存储的。在这种情况下,屏蔽是过分的(尽管知道可能很好)并且您仍然存在将long
转换为int
的问题(但我们不确定OP是否希望Int32
)@Sinatr:在这种情况下,可以使用uint
。我同意使用未选中的是最好的方法。不过,知道如何使用一些比特黑客还是很有用的。
csharp> (8797569417216^909522486)&((1L<<32)-1)
1849046582