1、按位操作符
1.1 按位“与”&(双目运算符):仅当两个操作数都为1时,结果为1,否则为0。参与运算的数以补码方式出现。
例:9&5=1
0000 1001------------- 9的补码
& 0000 0101------------- 5的补码
----------
0000 0001------------- 1的补码
应用:
a、通常将某些位清零或保留某些位。例如:将a的高八位清零,保留低八位,可做a&255运算。
00000000 11111111—————— 255的二进制数
00000000 00100000—————— a的二进制数
------------------
00000000 11111111
b、取某数的指定位。例如:设a=1000 1110,要取出a中第二位的1,则可以用 a & 0000 0010 实现。
1.2 按位“或”|(双目运算符):仅当两个操作数都为0时,结果为0,否则为1。
例:9|5=13
0000 1001------------- 9的补码
| 0000 0101------------- 5的补码
----------
0000 1101------------- 13的补码
应用:常用来将源操作数某些位置1。例如:设a=0100 0001,将低四位全部置1,则可以用 a | 0000 1111 实现。
1.3 按位“异或”^(双目运算符):参加运算的两数各对应的二进位相异或,当对应的二进位相异时,结果为1.
例: 9^5=12
0000 1001------------- 9的补码
^ 0000 0101------------- 5的补码
----------
0000 1101------------- 12的补码
应用:
a、特定位置取反。例如:设a=1001,将第2位取反,则可以用 a ^1011 实现。
b、不引入第三变量,交换两个数的值。
例:a=1,b=2,交换两个数的值
a=a^b;
b=a^b;
a=a^b;
001 011 011
^ 010 ^ 010 ^ 001
———— ———— ————
011 001 010
2、移位操作符
2.1 左移运算 <<(丢弃最高位,0补最低位):把一个数的所有位都向左移动若干位。
例如:int i=1;i=i<<2; //这表示将i里的值左移两位。
分析:1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(注:有符号数不完全适用)
2.2 右移运算 >>:把一个数的所有位都向右移动若干位。
例如:int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
分析:符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.