C++:左移和右移运算符 > > 和 < <

  • 简介
  • 语法
  • 备注
  • 左移
  • 右移
  • 移位和提升
  • 其他详细信息
  • 脚注

简介

按位移位运算符是右移位运算符 (>>) ,它将 shift 表达式 的位移动到右侧,左移运算符 (<<) ,这将向左移动 移位表达式 的位数。

语法

移位表达式 <<加法表达式
shift-expression >> additive-expression

备注

重要
以下说明和示例在 Windows 上适用于 x86 和 x64 体系结构。 对于 ARM 设备,左移运算符和右移位运算符的实现在很大程度上是不同的。

左移

左移运算符使 shift 表达式 中的位向左移动由 加法表达式 指定的位置数。 因移位运算而空出的位上将用零填充。 左移是逻辑移动(从末端移掉的位将被舍弃,包括符号位)

以下示例将显示使用无符号数字的左移运算。 该示例通过将值表示为 bitset 来显示对位的操作。

#include <iostream>
#include <bitset>using namespace std;int main() {unsigned short short1 = 4;bitset<16> bitset1{short1};   // the bitset representation of 4cout << bitset1 << endl;  // 0b00000000'00000100unsigned short short2 = short1 << 1;     // 4 left-shifted by 1 = 8bitset<16> bitset2{short2};cout << bitset2 << endl;  // 0b00000000'00001000unsigned short short3 = short1 << 2;     // 4 left-shifted by 2 = 16bitset<16> bitset3{short3};cout << bitset3 << endl;  // 0b00000000'00010000
}

如果你左移有符号的数字,以至于符号位受影响,则结果是不确定的。 下面的示例演示了将1位左移到符号位位置时所发生的情况。

#include <iostream>
#include <bitset>using namespace std;int main() {short short1 = 16384;bitset<16> bitset1(short1);cout << bitset1 << endl;  // 0b01000000'00000000short short3 = short1 << 1;bitset<16> bitset3(short3);  // 16384 left-shifted by 1 = -32768cout << bitset3 << endl;  // 0b10000000'00000000short short4 = short1 << 14;bitset<16> bitset4(short4);  // 4 left-shifted by 14 = 0cout << bitset4 << endl;  // 0b00000000'00000000
}

右移

右移运算符使 移位表达式 中的位模式向右移位(由 加法表达式 指定的位置数)。 对于无符号数字,因移位运算而空出的位上将用零填充。 对于有符号数字,符号位用于填充空出的位。 也就是说,如果数字为正,则使用 0;如果数字为负,则使用 1。

重要

符号为负的数字右移的结果依实现而定。 尽管 Microsoft c + + 编译器使用符号位来填充空出的位位置,但并不保证其他实现也这样做。

以下示例显示使用无符号数字的右移运算:

#include <iostream>
#include <bitset>using namespace std;int main() {unsigned short short11 = 1024;bitset<16> bitset11{short11};cout << bitset11 << endl;     // 0b00000100'00000000unsigned short short12 = short11 >> 1;  // 512bitset<16> bitset12{short12};cout << bitset12 << endl;     // 0b00000010'00000000unsigned short short13 = short11 >> 10;  // 1bitset<16> bitset13{short13};cout << bitset13 << endl;     // 0b00000000'00000001unsigned short short14 = short11 >> 11;  // 0bitset<16> bitset14{short14};cout << bitset14 << endl;     // 0b00000000'00000000
}

下一示例显示使用符号为正的数字的右移运算。

#include <iostream>
#include <bitset>using namespace std;int main() {short short1 = 1024;bitset<16> bitset1(short1);cout << bitset1 << endl;     // 0b00000100'00000000short short2 = short1 >> 1;  // 512bitset<16> bitset2(short2);cout << bitset2 << endl;     // 0b00000010'00000000short short3 = short1 >> 11;  // 0bitset<16> bitset3(short3);cout << bitset3 << endl;     // 0b00000000'00000000
}

下一示例显示使用符号为负的整数的右移运算。

#include <iostream>
#include <bitset>using namespace std;int main() {short neg1 = -16;bitset<16> bn1(neg1);cout << bn1 << endl;  // 0b11111111'11110000short neg2 = neg1 >> 1; // -8bitset<16> bn2(neg2);cout << bn2 << endl;  // 0b11111111'11111000short neg3 = neg1 >> 2; // -4bitset<16> bn3(neg3);cout << bn3 << endl;  // 0b11111111'11111100short neg4 = neg1 >> 4; // -1bitset<16> bn4(neg4);cout << bn4 << endl;  // 0b11111111'11111111short neg5 = neg1 >> 5; // -1bitset<16> bn5(neg5);cout << bn5 << endl;  // 0b11111111'11111111
}

移位和提升

移位运算符两侧的表达式必须是整数类型。 根据 标准转换中所述的规则执行整型提升。 结果的类型与提升的 移位表达式 的类型相同。

在下面的示例中,类型的变量 char 被提升为 int 。

#include <iostream>
#include <typeinfo>using namespace std;int main() {char char1 = 'a';auto promoted1 = char1 << 1;   // 194cout << typeid(promoted1).name() << endl;  // intauto promoted2 = char1 << 10;  // 99328cout << typeid(promoted2).name() << endl;  // int
}

其他详细信息

如果 加法表达式 为负,或者如果 加法表达式 大于或等于 (提升) 移位表达式 中的位数,则移位运算的结果是不确定的。 如果 加法表达式 为0,则不执行移位运算。

#include <iostream>
#include <bitset>using namespace std;int main() {unsigned int int1 = 4;bitset<32> b1{int1};cout << b1 << endl;    // 0b00000000'00000000'00000000'00000100unsigned int int2 = int1 << -3;  // C4293: '<<' : shift count negative or too big, undefined behaviorunsigned int int3 = int1 >> -3;  // C4293: '>>' : shift count negative or too big, undefined behaviorunsigned int int4 = int1 << 32;  // C4293: '<<' : shift count negative or too big, undefined behaviorunsigned int int5 = int1 >> 32;  // C4293: '>>' : shift count negative or too big, undefined behaviorunsigned int int6 = int1 << 0;bitset<32> b6{int6};cout << b6 << endl;    // 0b00000000'00000000'00000000'00000100 (no change)
}

脚注

1 以下是 c + + 11 ISO 规范 (INCITS/ISO/IEC 14882-2011 [2012] ) ,5.8.2 和5.8.3 部分中的移位运算符的说明。

E1 << E2 的值是 E1 向左移动 E2 位的结果,空出的位用零填充。 如果 E1 有一个无符号类型,则结果的值为 E1 × 2E2,减少的模数比结果类型中可表示的最大值多一个。 否则,如果 E1 具有有符号的类型和非负值,并且 E1 × 2E2 可在结果类型的相应无符号类型中表示,则该值转换为结果类型就是生成的值; 否则,该行为是不确定的。

E1 >> E2 的值是 E1 向右移动 E2 位的结果。 如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值为 E1/2E2的商的整数部分。 如果 E1 属于有符号类型且为负值,则结果值由实现决定。

该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处,本文章博客地址:https://blog.csdn.net/it_cplusplus/article/details/118833857

C++:左移和右移运算符 (> > 和 < <)相关推荐

  1. c语言中左移右移有什么作用,C语言中左移和右移运算符详细介绍

    搜索热词 C语言中左移和右移运算符详细介绍 左移运算符(< 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出 ...

  2. C++ 重载左移和右移运算符

    C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool.int ...

  3. C语言之左移和右移运算符

    1.左移运算符 格式:a<<b 将a这个数的各二进制位左移b位,要求b必须是非负整数,移动过程中,右边空出的位用0填补,高位左移溢出则舍弃该高位. 举例来看: a=5,二进制位:0000 ...

  4. 左移和右移运算符的重载问题(里面的绝对盲点)在做了一遍,还是出错了

    #include <iostream> //实现左移和右移的重载. using namespace std;class A { public:friend ostream operator ...

  5. 位运算符之---左移右移运算符(简单易懂)

    前言: 位运算符是用来对二进制位进行操作的 c语言中有6种位运算符: & 按位与 [链接]: https://blog.csdn.net/weixin_42837024/article/det ...

  6. c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  7. 左移运算符和右移运算符的使用

    先简单介绍一下,左移运算符和右移运算符的功能:         计算机中的数字是以二进制补码的形式存放的,而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动. 左移的结果: 1.左移会让最高 ...

  8. C符号之逻辑运算符 左移与右移 自增自减

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本篇文章 ...

  9. 左移与右移(C语言)

    C语言中有左移和右移运算符,也就是<< 和 >>. 左移丢掉最高位,后面补0: 右移保留符号位,往右移,如果是无符号数,右移最高位补0, 同样如果两者移动的位数比数据的最大位数 ...

最新文章

  1. 解决java.lang.UnsupportedClassVersionError
  2. [转载]《博客园精华集》Winform筛选结果(共105篇)
  3. 鸟哥的linux私房菜-文件压缩于打包-2
  4. 黑马vue---13、事件修饰符的介绍
  5. pytorch笔记——简易回归问题
  6. 【Java代码】道格拉斯-普克 Douglas-Peucker 抽稀算法分析及15w个坐标点抽稀到3.7w耗时从360s+优化到365ms接近1000倍的速度提升源码分享(并行流+多线程+泛型)
  7. 项目拆分子工程(简单版)
  8. C51指针定义和应用小结
  9. 千万级别数据查询优化_从千万级数据查询来聊一聊索引结构和数据库原理
  10. 什么样的外链才是高质量的外链|网站优化
  11. 网上Silverlight项目收集
  12. SpringBoot 入门篇(二) SpringBoot常用注解以及自动配置
  13. java_web基本概念
  14. PHP解析抖音无水印视频播放地址原理
  15. 计算机桌面显示图标字体怎么变大,电脑桌面字体图标变大了怎么办
  16. 读书笔记:《企业IT架构转型之道》
  17. 计算机最低配置有哪些,win10对电脑配置有哪些要求?win10最低配置要求
  18. 成为智者的四个敌人——唐望
  19. 写程序电脑常用快捷键
  20. mysql商城热销榜怎么实现_Redis实现商品热卖榜

热门文章

  1. 友善之臂NanoPi R2S入门笔记(附clash安装)
  2. Ubuntu 16.04 配置 PyTorch(GeForce GTX 1080Ti + CUDA 9.0 + Python 3.7) 全套教程
  3. 安卓APP微信分享改来源名字(防封防检测)
  4. 向量投影与向量投影矩阵_Wlk1229-
  5. 活着,本身就是最美的事 唯美生活生命感悟美文
  6. 永辉超市年营收911亿:净亏39亿 京东腾讯是重要股东
  7. skinme找不到java_我的世界hello minecraft启动器下载
  8. MATLAB中的一维插值与函数拟合
  9. 以太坊变红,为什么 ETH 必须持有这个关键支持
  10. ATX+Python+uiautomator2环境下进行手机UI自动化测试