c语言中,逻辑运算与位运算很容易混淆,但是它们的功能是完全不同的。逻辑运算认为所有的非零的参数都为TRUE,参数0表示false,它们返回1或0.
&&与||和&与|重要的区别是,如果第一个参数求值能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。
深入理解计算机系统第二章P36页,c语言中的逻辑运算答案
#include<stdio.h>
int main(){
int a= 0x66;
int b = 0x39;
printf("%x,%x,%x,%x,%x,%x,%x,%x",a&b,a|b,~a|~b,a&!b,a&&b,a||b,!a||!b,a&&~b);
return 0;
}
依次为ox20,ox7f,oxffffffdf,ox01,0x01,0x00,ox01
逻辑运算包括左移和右移,其中右移又包括逻辑右移和算术右移
逻辑右移与算术右移区别:逻辑右移在左端补k个0,算术右移在左端补k个最高有效位的值
注意是单个移动,而不是作为整体,看下面的例子,每个[]进行移动,而不是[][]两个一起移动,对于无符号数据必须是逻辑的,对于有符号数默认是算术的
x = [01100011][10010101]
x>>4(逻辑右移) [00000110][00001001]
算术右移 [00000110][11111001]