Если я хорошо понимаю, вы хотите увидеть n крайних левых битов двоичного представления числа.
Большинство реализаций будут использовать арифметические c сдвиг вправо, а не логический сдвиг вправо. Чтобы предотвратить такое поведение, необходимо преобразовать число в целое число без знака. Не имеет значения, когда вы сдвигаете числа без знака, но имеет значение, когда вы сдвигаете число со знаком.
unsigned getLeftBits(int n, int num)
{
return n >> (32 - num);
}
unsigned getLeftBits1(int n, int num)
{
return (unsigned)n >> (32 - num);
}
getLeftBits:
mov ecx, 32
mov eax, edi
sub ecx, esi
sar eax, cl <-------here
ret
getLeftBits1:
mov ecx, 32
mov eax, edi
sub ecx, esi
shr eax, cl <-------here
ret
https://godbolt.org/z/JuY_z4