为什么127等于这个比特串?C#

4

给定以下代码,它会将整数中的所有位打印出来:

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个回答

18

1 << i 是一个32位整数,因此会溢出。
我认为使用1l << i可以解决这个问题。
((long)1)<<i可能更易读。

另外,你有一个偏移一的错误。你想要从63到0而不是从64到1。因为1<<1是2而不是1。


啊,我该如何修改这个程序,以便它能正确地处理64位整数?对于我的项目来说,处理64位整数非常重要。 - Tom Gullen
我认为添加l后缀或将其转换为long类型会解决这个问题。 - CodesInChaos
处理64位问题的另一种方法是使用((intThisHand >> i) & 1) != 0。因为intThisHand已经是一个64位整数,所以移位操作将被正确执行。 - Michael Madsen
太好了,那很容易!我的循环应该是 for (int i = 63; i >= 0; i--) 来修复前导位,对吗? - Tom Gullen
是的,您需要循环使用(int i = 63; i >= 0; i--)。输出恰好是在进行模32移位时发生的情况(因此打印的第一个比特是127&1,第二个是127&2 ^ 31等,最后一个是127&2)。 - Yuliy

7

您是想知道为什么代码出错了,还是只是想将数字显示为二进制?

如果是后者,那么您可以直接使用以下方法,而不需要重新发明轮子:

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

或者,如果您想要在所有64位数字中填充:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接