Ответ от 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
затем дает инверсию маски, которая нам нужна.