Nor*_*man 2 c bit-manipulation function bit
这个表达式是评估2 ^ x的一种方法(我知道这种方法的危险性):
2 << (x-1)
Run Code Online (Sandbox Code Playgroud)
替换x = 0并且表达式给出了所需的结果1.但是当它放在一个函数中时,它总是返回0:
int fast_2_to_the(int x) {
return 2 << (x-1);
}
Run Code Online (Sandbox Code Playgroud)
这可以在这个程序中观察到:
int main(int argc, char *argv[]) {
printf("2 << (0-1) = %d\n", 2 << (0-1));
printf("fast_2_to_the(0) = %d\n", fast_2_to_the(0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中给出了以下输出:
2 <<(0-1)= 1
fast_2_to_the(0)= 0
为什么会这样?我是C的初学者,最近一直在学习按位运算符,所以任何相关的建议都会受到赞赏.
根据C99§6.5.73,具有负右操作数的位移是未定义的行为.这意味着编译器可以自由发出可能无法正常工作的代码,以防你有负移位(或者,根据关于未定义行为的通常规则,它也可能使恶魔飞出你的鼻子).
正如评论中所建议的那样,执行该转换的正确方法是,1 << x
只要结果不超出范围,该方法就可以正常工作int
.