Побитовый сдвиг останавливает мою программу?

Я работаю с заданием, где мне нужно написать функцию C, которая вычисляет log2 целого числа без знака n, находя самый значащий установленный бит и возвращая позицию этого бита. Например, если n равно 17 (0b10001), функция должна вернуть 4.

Ниже приведен код, который у меня есть до сих пор, но побитовая операция останавливает программу. Закомментировав цикл через строки 6-9, программа работает нормально. Я не могу для жизни меня понять, почему он делает это. Кто-нибудь может мне помочь?

#include<stdio.h>
#include<stdlib.h>

int mylog2(unsigned int n) {
    int log = 1;
    while (n != 1) {
        n >> 1;
        log++;
    }
    return log;
}


int main() {
    int a;
    a = mylog2(17);
    printf("%d", a);
    getch();
    return(0);
}

person user1676037    schedule 16.09.2012    source источник
comment
Тот факт, что ваша программа останавливается, может быть проблемой, но это не проблема остановки.   -  person sepp2k    schedule 16.09.2012
comment
+1 @Мистический. И user167037, если вы включите еще несколько предупреждений, вы, вероятно, получите что-то о результате выражения, не используемом для вашей исходной программы. clang даже предупреждает по умолчанию.   -  person Carl Norum    schedule 16.09.2012
comment
Да, я отредактировал это, чтобы остановить вместо этого.   -  person user1676037    schedule 16.09.2012
comment
Есть много гораздо более быстрых способов получить log₂n здесь. И ваш процессор, скорее всего, будет иметь для этого одну инструкцию. Проверьте внутренний список вашего компилятора   -  person phuclv    schedule 31.05.2019


Ответы (2)


У вас бесконечный цикл, потому что вы никогда не меняете значение n. Вместо n >> 1; используйте n = n >> 1.

person Musa    schedule 16.09.2012

Посмотрите в цикле while. Вы выполняете n >> 1, но никогда не назначаете его.

person Robert Kühne    schedule 16.09.2012