我最近在我的一个程序中偶然发现了一个奇怪的bug。
for (int i = 0; i < bitArray.Length; i++)
{
if (bitArray[i])
{
returnValue = returnValue + 2 ^ (7 - i);
}
}
在上面的代码片段中,如果returnValue=0,当它到达i=7的设置位时,结果输出是2,这是没有意义的(2^0应该是1)。 但是,如果我将代码替换为:
returnValue = returnValue + Convert.ToInt32(Math.Pow(2,(7 - i)));
正确计算结果为returnValue=1
该问题通过使用Math.pow()来解决,但是我非常想知道为什么它会发生在初始代码中。
在C#(以及许多其他语言)中,^运算符是布尔逻辑异或。
有关C#中布尔运算符的更多信息,请参阅本文档。
正如@Ishaysela和@Adomas所说,^是bollean逻辑异或。
但是为了在不使用Math.pow()的情况下执行您想要执行的操作,您只需要设置一个if条件来检查幂是否等于零。
if (bitArray[i]) {
if ((7 - i) == 0){
//returnValue += 1;
}
else{
//returnValue += 2 ^ (7 - i);
}
}
除了其他答案之外,如果只使用C#左移运算符<<
,假设BitArray.Length
小于或等于8,则可能最简单:
for (int i = 0; i < bitArray.Length; i++)
{
if (bitArray[i])
{
returnValue = returnValue + 1 << (7 - i);
}
}
如果returnvalue
是float类型,并且意图是允许2的负幂,那么稍作更改就会得到:
for (int i = 0; i < bitArray.Length; i++)
{
if (bitArray[i])
{
returnValue = returnValue + ((7-i) >= 0) ? 1 << (7 - i) : 1.0 / ((1 << (7 - i));
}
}
虽然在本例中Math.pow(2,7-i)
要干净得多。
for (int i = 0; i < bitArray.Length; i++)
{
if (bitArray[i])
{
returnValue = returnValue + Math.Pow(2, 7 - i);
}
}