C#为什么127 =这个位串?

时间:2010-10-15 22:18:23

标签: c# 64-bit bit-manipulation bits

鉴于此代码打印出整数中的所有位:

private string getBitLiteral(bool bitVal)
{
    if (bitVal)
    {
        return ("1");
    }
    else
    {
        return ("0");
    }
}

    Int64 intThisHand = 127;

    for (int i = 64; i > 0; i--)
    {
        HttpContext.Current.Response.Write(
            getBitLiteral((intThisHand & (1 << i)) != 0)
        );
    }

为什么打印出来:

1000000000000000000000000011111110000000000000000000000000111111

首先我是正确的,因为我希望最后7位是1的

其次,为什么中间有一些1?我希望它们都是0,除了尾随的7 1。

2 个答案:

答案 0 :(得分:18)

1 << i是32位整数,因此溢出 我认为1l << i会解决它 ((long)1)<<i可能更具可读性。

此外,您还有一个错误。你想要63到0而不是64到1.因为1&lt;&lt;&lt; 1是2而不是1。

答案 1 :(得分:7)

您是否对代码被破坏的原因感到好奇,或者您只是想将数字显示为二进制代码?

如果是后者那么你可以这样做而不是重新发明轮子:

string asBinary = Convert.ToString(intThisHand, 2);

或者,如果你想填充所有64位数字:

string asBinary = Convert.ToString(intThisHand, 2).PadLeft(64, '0');