位运算符
& 位与运算
运算规则:位与运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑与运算。例如:int型常量4和 7进行位与运算的运算过程如下:
4 = 0000 0000 0000 0100
&
7 = 0000 0000 0000 0111
= 0000 0000 0000 0100
对于负数,按其补码进行运算。例如:例如:int型常量-4和7进行位与运算的运算过程如下:
-4=1111 1111 1111 1100
&
7 = 0000 0000 0000 0111
= 0000 0000 0000 0100
| 位或运算
运算规则:位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。例如:int型常量5和 7进行位或运算的表达式为5|7,结果如下:
?5= 0000 0000 0000 0101
|
7= 0000 0000 0000 0111
=?0000 0000 0000 0111
^ 位异或
运算规则:位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。只有当对应位的二进 制数互斥的时候,对应位的结果才为真。
例如:int型常量5和7进行位异或运算的表达式为5^7,结果如下:
5=
0000 0000 0000 0101
^
7=
0000 0000 0000 0111
=
0000 0000 0000 0010
典型应用:
数值交换
数值交换。例如a=10,b=15。在例1中,无须引入第三个变量,利用位运算即可实现数据交换。
例1 编程实现两个数据的交换。
$a=10;//1010
$b=15;//1111
printf("\na=%d,b=%d",$a,$b);
$a=$a^$b;//1010 ^ 1111;$a = 0101
printf("\n%%a = '%b'",$a);
$b=$a^$b;//0101 ^ 1111;$b = 1010;
printf("\n%%b = '%b'",$b);
$a=$a^$b;//0101 ^ 1010;$a = 1111;
printf("\na=%d,b=%d",$a,$b);
a=10,b=15
%a = '0101'
%b = '1010'
a=15,b=10
~ 位非
运算规则:位非运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑非运算。例如:对int型常量7 进行位非运算的表达式为~7,结果为2,计算过程如下:
~?7=0000 0000 0000 0111
=?0000 0000 0000 0010