2

如果我这样做,bitXor(2496638211, -1798328965)我会在 R 中返回 120。

在 nodeJS 中2496638211 ^ -1798328965;返回 120。

我如何在 C# 中执行此操作?(认为​​我很难理解 c# 类型声明以及 R & nodeJS 可能转换为 32 位的方式)

4

2 回答 2

1

在 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()正在做的事情,但你真的确定这是你想要的行为吗?

于 2021-09-15T09:44:41.090 回答
1

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 关键字用于抑制整数类型算术运算和转换的溢出检查。

于 2021-09-15T09:55:22.453 回答