4


0

C#なぜ127 =このビット文字列ですか?

整数のすべてのビットを出力するこのコードを考えると:

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があるのですか? 末尾の7 1以外はすべて0になると予想されます。

2 Answer


18


「1 << i」は32ビット整数であるため、オーバーフローします。 +「1l << i」で解決すると思います。 + `((long)1)<は読みやすいかもしれません。 `

さらに、off-by-oneエラーがあります。 64から1ではなく、63から0に進みます。 1 << 1は2であり、1ではありません。


7


あなたのコードが壊れている理由に興味がありますか、それとも数字をバイナリとして表示しようとしていますか?

後者の場合、ホイールを再発明するのではなく、これを行うことができます。

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

または、64桁すべてを埋める場合:

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