(C) в операциях сдвига битов, каково соглашение относительно сдвига влево и вправо? - PullRequest
0 голосов
/ 30 апреля 2020

Это из программирования Кочана в C 4-м издании

В этой главе на самом деле не касались масок, но поиск в Интернете дал некоторые хорошие ресурсы. Я написал следующее, цель состоит в том, чтобы проверить, включен ли бит или выключен.

int bit_test(unsigned int x, int n)
{
    unsigned int mask, offset;

    offset = 32-1-n;  //there is another function that counts the bit size (32), removed for brevity

    mask = 0x1 << offset;

    return x & mask;
}

int main (void)
{
    unsigned int x = 63;
    int n = 2;

    printf("%s\n", bit_test(x,n) ? "On":"Off");

    return 0;
}

У меня сложилось впечатление, что число n должно быть числом пробелов справа, которые я хочу проверить. Итак, для 63 мое двоичное представление равно 1111. Поэтому, если N равно 2, это должно быть «Вкл.», Или третье 1 справа - «Вкл.»

Мой фактический вывод «выключен». Когда я добавляю 29 как N, я получаю «вкл», где, исходя из того, как я рассчитывал, он должен быть «выключен». Я подозреваю, что я не использую правильную процедуру, чтобы определить это вручную, считаю ли я слева от 32-битного поля? Есть ли что-то еще, что я пропускаю?

Любое понимание вышесказанного будет оценено, спасибо.

...