C语言中的逻辑运算符:按位与,按位或,按位异或,取反,左右移位

c语言中存在6个位操作运算符,且它们只能用于整形操作数。

   &         按位与

   |          按位或

   ^         按位异或

   <<      按位左移

   >>      按位右移

   ~        按位取反


1..按位与(AND):&

      一定要将&与&&区分开来,后者是逻辑与。


(1)按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.

0 & 0 = 0;

0 & 1 = 0;

1 & 1 = 1;

(2)根据这个特性,&操作常常用来屏蔽特定的二进制位。例如:

             0000 1111 & 0000 0011

             结果为0000 0011.可以看见,1111的前两位被屏蔽成为0了。

             所以如果想清空数据,只需要将原二进制数与上0就可以了。0的位数对应原二进制数的位数,对各位进行屏蔽,全部置0.


             相对的,&可以利用0来屏蔽,也可以用1来读取。

             例如: 一个二进制数 1101 1001,我只想要它的后四位,怎么办呢?

             只需要进行如下操作:1101 1001 & 0000 1111即可。

             其实该方法是屏蔽和读取的结合,&0保证消除无用位,&1保证有用数据的完整性。


            总结:对于原二进制数来说,&0是屏蔽,&1是不变。


2.按位或(OR):|

            同样,不要将“|”和“||”(逻辑或)搞混。

(1)定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.

            0 | 0 = 0;

            0 | 1 = 1;

            1 | 0 = 1;

            1 | 1 = 1;

(2)特殊用处:

            将某些特定位置1.

            例如:1010 0000 | 0000 1111.

            结果为 1010 1111.

            总结:对于原二进制数来说,|0是不变,|1是置1.


3.按位异或:^

           ^这个符号我们常用来表示次方。不过在计算机中,它代表的就不是次方的意思了。

(1)定义

           只要参与运算的双方互异,结果就为1,否则为0.

           0 ^ 1 = 1;

           1 ^ 0 = 1;

           1 ^ 1 = 0;

           0 ^ 0 = 0;

(2).用法

           可以通过上面的定义看到,一个数^1的话就会0变成1,1变成0,而^0则不对原数进行改变。所以根据此特性可以对特定位进行0 1 反转。

          例如: 1100 1100 ^ 0000 1100

          结果为 1100  0000.

          同样的,如果对一个数进行^0,代表保留原值。

         总结:对于原二进制数来说,^0是不变,^1是反转。


4.取反(~)

         对一个二进制数进行取反。1变0,0变1.

         唯一需要注意的一点是,~的优先级是逻辑运算符中最高的,必须优先计算。


5.左移,右移

         左移与右移比较类似,是将目标二进制数字向左/右移动相应的位数。

         左移补0:1111 1111 <<1 == 1111 1110,换算十进制的话是原来数值的2倍。

         右移看情况:负数补1,正数补0.需要看符号位。同样,换算为十进制数值变为原来的1/2.

         总结:左乘右除。













 




猜你喜欢

转载自blog.csdn.net/czc1997/article/details/78121566