C # Почему 127 = эта битовая строка? - PullRequest
4 голосов
/ 16 октября 2010

Учитывая этот код, который выводит все биты в целое число:

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 голосов
/ 16 октября 2010

1 << i - 32-разрядное целое число, поэтому оно переполняется.
Я думаю 1l << i исправит это.
((long)1)<<i может быть более читабельным.

Кроме того, у вас есть ошибка "один за другим". Вы хотите перейти от 63 до 0, а не от 64 до 1. Так как 1 << 1 равно 2, а не 1. </p>

7 голосов
/ 16 октября 2010

Вам интересно, почему ваш код не работает, или вы просто пытаетесь отобразить число в двоичном виде?

Если последнее, то вы можете просто сделать это, а не изобретать колесо:

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

Или, если вы хотите добавить все 64 цифры:

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