VB6按位转换为c#的布尔结果
本文关键字:布尔 结果 转换 VB6 | 更新日期: 2023-09-27 18:13:38
如果我在VB6:
GetBit = 414 And 2 ^ 0
GetBit将等于false,因为函数的返回类型是布尔值。我不确定vb6是如何提出虚假的,虽然?
如何将其转换为c#?
long longResult = 0;
longResult = 414 & 2 ^ 0;
return Convert.ToBoolean(longResult);
^上面的c#代码返回true,其中longResult为2。我知道2是如何计算的,但我不确定如何/为什么在vb6代码返回false ?
Basic中的^运算符是Math.Pow()。因此在VB6中,它被计算为414 &数学。Pow(2,0) == 0x19E &1 = 0 == False。注意整数字面值的0次幂并不是很有用,结果总是1。
在c#中,^运算符是异或运算符,不是一回事。更仔细的审查当然是有必要的。这不是那种你想要盲目音译的代码,很有可能你只是重现了一个bug。
真正的代码是:long result = firstParam &数学。战俘(2,secondParam);
。请记住,VB6中的Long
是一个32位整数,而c#中的int
是一个32位整数。你真的不想用浮点数学。正确的转换是:
int result = firstParam & (1 << secondParam);
Update:我完全忽略了c#中的^是XOR而不是Pow(),非常尴尬。我决定留下我的答案,因为VB6解决方案仍然是正确的,因为两个链接到具有操作符优先级的页面。
原文:经典运算符优先级问题;-)c#和VB6在这方面有所不同。
在VB6中,位运算符的优先级比算术运算符低,参见Visual Basic中的运算符优先级。结果是2 ^ 0 = 1 414 1 = 0
得到True的解是:
GetBit = (414 And 2) ^ 0
为完整起见,您可以在这里找到c#操作符优先级。事实证明,&