C 按位移位使我的程序停止?

C 按位移位使我的程序停止?,c,bit-manipulation,shift,halt,C,Bit Manipulation,Shift,Halt,我正在处理一个赋值,在这个赋值中,我必须编写一个C函数,通过查找最重要的集合位并返回该位的位置来计算无符号整数n的log2。例如,如果n为17(0b10001),则函数应返回4 下面是我到目前为止的代码,但按位操作会使程序停止。通过第6-9行注释循环,程序运行良好。我一辈子都不明白它为什么会这样。有人能帮我吗 #include<stdio.h> #include<stdlib.h> int mylog2(unsigned int n) { int log = 1

我正在处理一个赋值,在这个赋值中,我必须编写一个C函数,通过查找最重要的集合位并返回该位的位置来计算无符号整数n的log2。例如,如果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);
}
#包括
#包括
int mylog2(无符号int n){
int log=1;
而(n!=1){
n>>1;
log++;
}
返回日志;
}
int main(){
INTA;
a=mylog2(17);
printf(“%d”,a);
getch();
返回(0);
}

您有一个无限循环,因为您从未更改n的值。而不是
n>>1使用
n=n>>1

您有一个无限循环,因为您从未更改n的值。而不是
n>>1使用
n=n>>1

查看while循环。您确实执行了
n>>1
,但从未分配它。

查看您的while循环。您确实执行了
n>>1
,但从未分配它。

n>>1->
n>>=1您的程序停止可能是一个问题,但这不是停止的问题。+1@mystical。和user167037,如果您打开更多的警告,您可能会得到一些关于原始程序的“表达式未使用的结果”的信息
clang
默认情况下甚至会发出警告。是的,我现在将其编辑为“暂停”。有很多更快的方法来获取日志₂加入。你的CPU也很可能只有一条指令来做这件事。检查编译器的内部列表
n>>1->
n>>=1您的程序停止可能是一个问题,但这不是停止的问题。+1@mystical。和user167037,如果您打开更多的警告,您可能会得到一些关于原始程序的“表达式未使用的结果”的信息
clang
默认情况下甚至会发出警告。是的,我现在将其编辑为“暂停”。有很多更快的方法来获取日志₂加入。你的CPU也很可能只有一条指令来做这件事。检查编译器的内部列表