位运算符:&(按位与) |(按位或) ^(异或) ~(取反) <<(左移) >>(右移)
常量是有符号的,位操作中无符号数要进行强制类型转换!
1. 按位与(两者都为1结果才为1,有0结果必为0)
应用:
清零特定位:(mask中特定位置0,其他位为1,s = s & mask;)
取某数指定位:(mask中特定位置1,其他位为0,s = s & mask;)
2. 按位或(两者都为0结果才为0,有1结果必为1)
应用:
将源操作数某些位置1,其余位不变(mask中特定位置1,其他位为0,s = s | mask;)
3. 异或(两者不同为1,相同为0)
应用:
使特定位的值取反(mask中特定位置1,其他位为0,s = s ^ mask;)
不引入第三变量,交换两个变量的值(三种)
1) a = a + b; b = a – b; a = a – b;不适用于两个大数交换,会导致越界
2) a = a * b; b = a / b; a = a / b;不适用于有0的两数交换
3) a = a ^ b; b = a ^ b; a = a ^ b;建议使用,效率高
4. 左移
高位丢弃,低位补0
5. 右移
对于无符号数:高位补0,低位丢弃
对于有符号数:正数高位补0,负数高位补0或补1由编译系统规定(gcc中右移补1)
6. C语言性能优化:使用位运算
使用位运算减少除法和取模的运算,在计算机中数据的位是可以操作的最小数据单位,理论上可以用位运算来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者进行数据交换,灵活的位操作可以有效地提高程序运行的效率。
7. 进制转换:
十进制转二进制显示:
方法一:
方法二:
十进制转十六进制显示:
8. 掩码mask
什么是掩码?
掩码是一串二进制代码对目标字段进行位与运算,屏蔽当前的输入位。将源码与掩码经过按位运算或逻辑运算得出新的操作数。其中要用到按位运算如OR运算和AND运算。用于如将ASCII码中大写字母改作小写字母
m到n位置1计算公式:
1. mask =(unsigned int)((~(unsigned int)0) >> (32 – (n – m + 1))) << m;
2. for(i = 0; i <= m; i++)
{
mask1 = 2 * mask;
}
for(i = 0; i <n; i++)
{
mask2 = 2 * mask;
}
mask = mask1 – mask2;
mask = int2bin(mask);