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があるのですか?末尾の71を除いて、すべて0になると思います。

4

2 に答える 2

18

1 << iは32ビット整数であるため、オーバーフローします。
私は1l << iそれを修正すると思います。
((long)1)<<i読みやすいかもしれません。

さらに、1つずつずれたエラーが発生します。1 << 1は2であり、1ではないため、64から1ではなく63から0になります。

于 2010-10-15T22:20:08.167 に答える
7

コードが壊れている理由に興味がありますか、それとも数値を2進数で表示しようとしているだけですか?

後者の場合は、車輪の再発明を行うのではなく、これを行うことができます。

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

または、64桁すべてをパディングする場合は、次のようにします。

string asBinary = Convert.ToString(intThisHand, 2).PadLeft(64, '0');
于 2010-10-15T22:34:42.410 に答える