逻辑运算符非逻辑运算符(逻辑运算符VS位运算符)
逻辑运算符有:
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假
如:
#include <stdio.h>
int main(){
int a = 5;
int b = 20;
int c ;
if ( a && b )
{
printf("Line 1 - 条件为真\n" );
}
if ( a || b )
{
printf("Line 2 - 条件为真\n" );
}
/* 改变 a 和 b 的值 */
a = 0;
b = 10;
if ( a && b )
{
printf("Line 3 - 条件为真\n" );
}
else
{
printf("Line 3 - 条件为假\n" );
}
if ( !(a && b) )
{
printf("Line 4 - 条件为真\n" );
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - 条件为真
Line 2 - 条件为真
Line 3 - 条件为假
Line 4 - 条件为真
这些逻辑运算很理解。
我们着重讲位运算符
位运算符位运算符作用于位,位运算符有&、 | 、 ^、~、<<、>> 。
&按位与操作,按二进制位进行"与"运算。运算规则:
0&0=0;
0&1=0; 1&0=0; 1&1=1;
| 按位或运算符,按二进制位进行"或"运算。运算规则:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
^ 异或运算符,按二进制位进行"异或"运算。运算规则:
0^0=0; 0^1=1; 1^0=1; 1^1=0;
~取反运算符,按二进制位进行"取反"运算。运算规则:
~1=-2; ~0=-1;
<< 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
上面估计还有些同学看不懂。所谓位运算符就是针对位(二进制进行操作的),位是什么概念,我们回顾一下,int 占4个字节,而一个字节占8位。数据在计算存储都是以二进制存的,也就是0与1存的。
Eg:
int a=6;//0000 0110 在计算机存储。本来是0000 0000....共有32位,只是前面全是0,我们就写成8位。
下面我们举个例
实例#include <stdio.h>
int main()
{
unsigned int a = 60;/* 60 = 0011 1100 */
unsigned int b = 13;/* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c 的值是 %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c 的值是 %d\n", c );
c = a ^ b; /* 49 = 0011 0001 *
printf("Line 3 - c 的值是 %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c 的值是 %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c 的值是 %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\n", c );
}
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15
我们上述程序讲解一下。
unsigned int a = 60;/* 60 = 0011 1100 */
unsigned int b = 13;/* 13 = 0000 1101 */
a&b 按上表的按位与规则
a&b=0000 1100= 0*2^7 0*2^6 0*2^5 0*2^4 1*2^3 1*2^2 0*2^1 0*2^0
=0 0 0 0 8 4 0 0=12
同理“ | ” “^”也可以按规则计算,”^”运算符规则就记住 两个值不相同,则异或结果为1。如果两个值相同,异或结果为0。
取~符号 就是把二进制对应位取为相反就可以了,0变成1,1变成0。So easy !
左移<< 就是二进制整个往左移,不足补0。右移>> 就是二进制整个往右移,不足补0,
Eg:
Int a=6 ;//0000 0000 0000 0000 0000 0000 0000 0110 图这里我们只管8位,再往左全是0(左边是高位),就不会管了。
a<<2;//
0000 0000 0000 0000 0000 0000 0001 1000->0001 1000=22
左移是把左边的移出去,不够位的再右补0。同理右移把右边的移出去,不够位的再左补0。
大家还有什么地方不好理解的,欢迎留言,我们一起讨论。关注我,下次针对留言分享干货。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com