
移位运算
逻辑移位
1.对象:无符号数
2.移位规则
- 逻辑左移:高位移除,低位补0
- 逻辑右移:低位移除,高位补0
3.应用:对单独某位清0或置1
- 清0:先按位取反,再与运算
- 置1:直接或运算,与1相或均位1
#define b6_mask (1<<6)
unsigned char data = 4;
//清0
data &= ~b6_mask;
//置1
data |= b6_mask
算术移位
1.对象:有符号数(仅针对定点数)
2.移位规则
- 符号位保持不变,仅对数值位进行移位
- 真值为正数时:添补0,最高位丢1,则结果出错;最低位丢1,则精度缺失。
- 真值为负数时
- 原码添补0:最高位丢1,则结果出错;最低位丢1,则精度缺失
- 反码添补1:最高位丢0,则结果出错;最低位丢0,则精度缺失
- 补码左移添补0,右移添补1:最高位丢0,则结果出错;最低位丢1,则精度缺失;
3.补码的另一种算术移位
- 符号位也参与移位运算
- 移位规则
- 左移:低位补0;若符号位发生变化,则发生溢出
- 右移:高位添补符号
- 符号位参与移位的优点
- 有检测溢出的方法:符号位变化
- 2.便于ALU处理,方便记忆
4.应用:仅用加法运算和算术移位实现乘法运算
5.C语言中的移位运算
- "<<"表示左移,左移是逻辑左移:高位移除,低位补0
- ">>"表示右移
- 无符号数是逻辑右移:,低位移除,高位补0
- 有符号数是算术右移:低位移除,高位添补符号
循环移位
1.对象:无符号数
2.移位规则
3.根据进位标志CF是否加入循环过程,分为
- 不带CF标志位的循环左移
- 不带CF标志位的循环右移
- 带CF标志位的循环左移
- 带CF标志位的循环右移
4.循环移位的应用
- 加密算法:通过循环移位实现数据的混淆和置换
- 哈希算法:通过循环移位改变数据的排序,产生不同的哈希值
- 优化算法:加速算法的执行等
5.循环移位的C语言实现
/*32位无符号整数循环移位,n表示循环位数*/
// 循环左移
unsigned int circulLeft(unsigned int calue,int n){
return (value<<n)|(value>>(32-n));
}
// 循环右移
unsigned int circulLeft(unsigned int calue,int n){
return (value>>n)|(value<<(32-n));
}