提问者:小点点

C#升数至幂


我最近在我的一个程序中偶然发现了一个奇怪的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()来解决,但是我非常想知道为什么它会发生在初始代码中。


共3个答案

匿名用户

在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);
    }
}