получение спецификаций c k бит из десятичного числа - PullRequest
0 голосов
/ 03 мая 2020

У меня есть число x, и я хочу вывести десятичное число k битов из x, предположим, что у меня есть число 12 x = 12 k = 3 двоичное число из 12 равно 1100, и k = 3, поэтому мой новый двоичный файл будет равен 100 (десятичное число равно 8) ie с последней позиции я хочу отобразить 8 как вывод

Я хочу сделать это с помощью << и >> в c ++ Спасибо !!

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Вот один из способов сделать это: обнулить последние k биты, затем вычесть это из x.

unsigned int last_k_bits(unsigned int x, unsigned int k) {
    return x - ((x >> k) << k);
}

Вы также можете вычислить побитовое & из x и 1 ... 1 (k 1 с)

unsigned int last_k_bits(unsigned int x, unsigned int k) {
    return x & ((1u << k) - 1);
}

Кроме того, 100 - это 4 в десятичном виде, а не 8

0 голосов
/ 03 мая 2020

Ответ от sparik не даст правильного результата, когда k равно всей ширине (например, 32), что может иметь или не иметь значение в зависимости от приложения. Это версия, которая также дает правильный результат для этого случая:

unsigned int last_k_bits(unsigned int x, unsigned int k) {
    return x & ~((((k >> 5) - 1) << k));
}

Здесь k >> 5 дает 1, если k равно 32, и 0 в противном случае. Вычитая один, вы получаете все единицы, кроме k = 32, где это все нули. Сдвиг на k затем дает инверсию маски, которая нам нужна.

...