当前位置: 首页 > news >正文

位运算操作符(移位操作符)

移位操作符移动的是存储在内存中的补码的二进制序列 

<<   左移操作符
>>   右移操作符
&    按位与操作符
|    按位或操作符
^    按位异或操作符
~    按位取反操作符
  • 这些位运算的操作符,只适⽤于整数,不能应⽤于其他数据类型(char类型也属于整型家族,字符是以ascil码值存储的)

左移操作符

正数

10左移1位变成了20,针对正数,左移1位有乘2的效果

#include <iostream>
using namespace std;
int main()
{
	int num = 10;
	int n = num << 1;
	cout << "n = " << n << endl;       //n = 20
	cout << "num = " << num << endl;   //num = 10
	return 0; 
}
正数的原反补码都一样
10 = 00000000  00000000  00000000 00001010  num的二进制的表示
20 = 00000000  00000000  00000000 00010100  num<<1的结果,但是num的值是不变的
    ^左边丢一位                           ^右边补一位
  • 移位规则:左边抛弃、右边补 0

负数

负数左移先把负数写出原反补码再左移,打印出来还要再算出原码

#include <iostream>
using namespace std;
int main()
{
	int num = -10;
	//10000000 00000000 00000000 00001010   -10的原码
	//11111111 11111111 11111111 11110101   -10的反码
	//11111111 11111111 11111111 11110110   -10的补码

	int n = num << 1;
	//11111111 11111111 11111111 11101100   n的补码
	//10000000 00000000 00000000 00010011   n的反码
	//10000000 00000000 00000000 00010110   n的原码

	cout << "n = " << n << endl;       //n = -20
	cout << "num = " << num << endl;   //num = -10
	return 0;
}

右移操作符

右移运算分两种:逻辑右移和算术右移,具体采⽤哪种右移⽅式取决于编译器,⼤部分的编译器采⽤ 的是算术右移。两种移位⽅式的规则如下:

  1. 逻辑右移:左边⽤ 0 填充,右边丢弃
  2. 算术右移:左边⽤原该值的符号位填充,右边丢弃

#include <iostream>
using namespace std;
int main()
{
	int num = -1;
	int n = num >> 1;
	cout << "n = " << n << endl;      //n = -1
	cout << "num = " << num << endl;  //num = -1
	return 0;
}

  • 逻辑右移补0进去,num会变成一个非常大的正数,但这里还是-1,说明在gcc编译器上,采用的是算术右移

右移是否有乘2的效果?

  • 对于正数,右移一位有除2的效果

警告

  • 对于移位运算符,不要移动负数位,这个是标准未定义的
int num = 10;
num >> -1;//error

相关文章:

  • 【3DMAX插件】3DMAX建筑大师插件MasterBuilder使用方法
  • Java/Kotlin逆向基础与Smali语法精解
  • 十分钟临时邮箱服务源码带api
  • pytest数据库测试文章推荐
  • DICOM医学影像脱敏技术应用的重要性及其实现方法详解
  • 命名管道的创建和通信实现
  • cesium地图设置3d,2d,2.5d动态切换
  • 企业员工薪酬关系系统的设计与实现(代码+数据库+LW)
  • 全球首款 5G-A 人形机器人发布
  • 网易邮箱如何用大数据任务调度实现海量邮件数据处理?Apache DolphinScheduler用户交流会上来揭秘!
  • 第十五章:go package 包的管理
  • 跨域问题。
  • 每日一练之链表的回文结构
  • LLaMA-Factory训练DeepSeek大模型+本地部署
  • Fedora41安装MySQL8.4.4
  • java每日精进 3.11 【多租户】
  • [Lc10_hash] 总结 | 两数之和 | 字符重排 | 存在重复元素 i ii | 字母异位词分组
  • 鸿蒙app开发中实现 底部抽屉效果动效
  • 修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法
  • 阿里云操作系统控制台实战评测:提升云资源管理与监控效率
  • 2025上海科技节将于5月17日开幕,拟设6大板块专题活动
  • 首届上海老年学习课程展将在今年10月举办
  • 抗战回望21︱《“良民”日记》:一个“良民”在沦陷区的见闻与感受
  • 超燃!走过莫斯科街头的“中国排面”
  • 专访|李沁云:精神分析不会告诉你“应该怎么做”,但是……
  • 巴基斯坦:印度向巴3处地点发射导弹