如果我这样做,bitXor(2496638211, -1798328965)我会在 R 中返回 120。
在 nodeJS 中2496638211 ^ -1798328965;返回 120。
我如何在 C# 中执行此操作?(认为我很难理解 c# 类型声明以及 R & nodeJS 可能转换为 32 位的方式)
如果我这样做,bitXor(2496638211, -1798328965)我会在 R 中返回 120。
在 nodeJS 中2496638211 ^ -1798328965;返回 120。
我如何在 C# 中执行此操作?(认为我很难理解 c# 类型声明以及 R & nodeJS 可能转换为 32 位的方式)
在 C# 中,您必须使用unchecked并强制转换为 int:
unchecked
{
int result = (int)2496638211 ^ -1798328965;
Console.WriteLine(result); // Prints 120
}
你可以写一个方法来做到这一点:
public static int XorAsInts(long a, long b)
{
unchecked
{
return (int)a ^ (int)b;
}
}
然后调用它:
Console.WriteLine(XorAsInts(2496638211, -1798328965)); // Prints 120
请注意,通过转换为int,您将丢弃long. 这就是bitXor()正在做的事情,但你真的确定这是你想要的行为吗?
2496638211大于 32 位整数,在 64 位系统中,C# 整数默认为 long,因此十六进制值表示为0x94CFAD03. 这9与符号位重叠。这也意味着由于负数表示而导致的-1798328965结果。0xFFFFFFFF94CFAD7B所以 C# 得到0xFFFFFFFF00000078了正确的答案。
JS XOR使用 32 位操作数,因此它会截断2496638211. 因此 JS 得到0x00000078这在技术上不是正确的答案。我的假设是 R 做相同或相似的事情。
在 JS 中使用Number.isSafeInteger()以及Number.MAX_SAFE_INTEGER. 在 C# 中检查int.MaxValuevslong.MaxValue以查看与 JS 的区别。
unchecked要在 C# 中重新创建 JS 行为,请按照 Matthew Watson 帖子将其包装在一个块中。unchecked 关键字用于抑制整数类型算术运算和转换的溢出检查。