C语言运算符包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符。上一次我们讲了算术运算符中的 ,-- ,%这些难以理解的或平时工作需要注意运算符。这一次我们讲逻辑运算符与位运算符,剩下的运算符都很简单不用,我就不多说了,为什么要把这两种运算符放一起讲,因为很多在工作中的同学(在阿里巴巴,华为这些大公司,都称同事叫同学,这里我们就可以称呼)都经常搞混淆或者不会用,我在工作中就见过这样的同学,面试也遇到过。下面我们步入正题。

逻辑运算符有:

&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。

|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真

! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假

如:

#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 按上表的按位与规则

逻辑运算符非逻辑运算符(逻辑运算符VS位运算符)(1)

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;//

逻辑运算符非逻辑运算符(逻辑运算符VS位运算符)(2)

0000 0000 0000 0000 0000 0000 0001 1000->0001 1000=22

左移是把左边的移出去,不够位的再右补0。同理右移把右边的移出去,不够位的再左补0。

大家还有什么地方不好理解的,欢迎留言,我们一起讨论。关注我,下次针对留言分享干货。

,