数据的运算:移位运算

移位运算

逻辑移位

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.应用:仅用加法运算和算术移位实现乘法运算
  • 左移一位相当于×2
  • 右移一位相当于÷2
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));
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值