VB6 按位并转换为 c# 作为布尔结果

VB6 Bitwise And converted to c# as boolean result

如果我在 VB6 中有:

GetBit = 414 And 2 ^ 0

GetBit 将等于 false,因为函数的 return 类型是布尔值。我不确定 vb6 是如何得出 false 的?

如何将其转换为 C#?

long longResult = 0;
longResult = 414 & 2 ^ 0;

return Convert.ToBoolean(longResult);

^ 上面的 c# 代码 return 在 longResult 为 2 的地方我是真的。我明白 2 是如何计算的,但我不确定 how/why false 是 returned vb6 代码?

Update:我完全忽略了C#中的^是XOR而不是Pow(),非常尴尬。我决定留下我的答案,因为 VB6 解决方案仍然是正确的,并且因为有两个指向具有运算符优先级的页面的链接。

原文post:经典的运算符优先级问题;-) C#和VB6在这方面有差异。

在 VB6 中,按位运算符的优先级低于算术运算符,请参阅 Operator Precedence in Visual Basic。所以发生的是 2 ^ 0 的计算结果为 1,而 414 而 1 为 0。

得到True的解决方案是:

GetBit = (414 And 2) ^ 0

为了完整起见,您可以找到 C# 运算符优先级 here。事实证明,& 仅比 C# 中的 ^ 高一级。

Basic 中的 ^ 运算符是 Math.Pow()。所以在 VB6 中它被评估为 414 & Math.Pow(2, 0) == 0x19E & 1 = 0 == False。请注意,将整数文字计算为 0 的次方并不是很有用,结果始终为 1。

在C#中,^运算符是异或运算符,不是一回事。只需使用 1.

更仔细的审查当然是必要的。这不是您想要盲目音译的那种代码,您只是在重现错误的可能性很大。


So really code is: long result = firstParam & Math.Pow(2, secondParam);

没有。请记住,VB6 中的 Long 是一个 32 位整数,您需要 C# 中的 int。而且您真的不想使用浮点数学。正确的转换是:

  int result = firstParam & (1 << secondParam);