получить n leftBits двоичного кода в C - PullRequest
0 голосов
/ 30 мая 2020

Получил функцию getLeftBits (int n, int num), и мне нужно вернуть количество битов слева, например:

getLeftBits(7,31) --> 3  
getLeftBits(-1,2) --> 3

Я легко справляюсь с каждым n> 0: n >> (32 - num)
но когда n <0 возникли проблемы. </p>

Есть предложения?

1 Ответ

1 голос
/ 30 мая 2020

Если я хорошо понимаю, вы хотите увидеть n крайних левых битов двоичного представления числа.

Большинство реализаций будут использовать арифметические c сдвиг вправо, а не логический сдвиг вправо. Чтобы предотвратить такое поведение, необходимо преобразовать число в целое число без знака. Не имеет значения, когда вы сдвигаете числа без знака, но имеет значение, когда вы сдвигаете число со знаком.

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...