位运算的现实意义:通过位运算符,可以使对数据的操作精确到每一位
-
&
:按位于int a = 5; int b = 7; int c; c = a & b; printf("%d\n",c);//输出结果:5
a&b
的意思是:把a的二进制代码,和b的二进制代码,一一进行“与”运算a的二进制:0101
b的二进制:0111
从左往右看:0和0相与是0;1和1相与是1;0和1相与是0;1和1相与是1,所以
a&b
结果是0101,换算成十进制就是5 -
|
:按位或int a = 3; int b = 5; int c; c = a | b; printf("%d\n",c);//输出结果:7
a|b
的意思是:把a的二进制代码,和b的二进制代码,一一进行“或”运算a的二进制:0011
b的二进制:0101
从左往右看:0和0相或是0;1和1相或是1;0和1相或是1;1和1相或是1,所以
a|b
结果是0111,换算成十进制就是7 -
~
:按位取反int a = 3; a = ~3; printf("%d\n",a);//输出结果:-4
a的二进制代码:0011,但是要注意这是int类型,占4个字节,也就是32位,因此a完整的二进制是:0000 0000 0000 0000 0000 0000 0000 0011,全部取反后是:1111 1111 1111 1111 1111 1111 1111 1100,也就是十进制的-4
-
^
:按位异或异或:相同为0,不同为1
1^0=1
0^1=1
1^1=0
0^0=0 -
<<
:按位左移int i= 3; i = i<<3; printf("%d\n",i);//输出结果:24
i<<3
表示把i
的所有二进制位左移3位,右边补零i
的二进制是0011,左移3位后就是0001 1000,也就是十进制的24补充:
- 左移n位相当于乘以2n,前提是要注意数据不能丢失
i<<3
和i*8
比较,前者执行的速度更快
-
>>
:按位右移i>>3
表示把i
的所有二进制位右移3位,左边分情况补0或补1(一般都是补0)-
第一种情况(算数右移):
-
如果本身是正数(二进制下最高位是1),右移后左边补零
-
如果本身是负数(二进制下最高位是0),右移后左边补一
-
-
第二种情况(逻辑右移):
- 不管二进制下最高位是0还是1,右移后左边都补零
i
的二进制是0011,左移3位后就是0001 1000,也就是十进制的24补充:
- 右移n位相当于除以2n,前提是要注意数据不能丢失
i>>3
和i/8
比较,前者执行的速度更快
-