目录

  • 一、概述
  • 二、正文
    • (1)结合图示篇,更加简单明了。
    • (2)文字描述篇,更深入。

一、概述

本文是根据整合网上资料与相关博文总结出来的关于【 C/C++左移右移运算符 】的知识。

二、正文

(1)结合图示篇,更加简单明了。

移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。

逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。

算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。

c++中,整数分有符号数和无符号数两种,对于这两种数做左移、右移运算,稍有区别:

1、如果是无符号数,不管是左移还是右移都是“逻辑移位”

例如,分别对无符号数 179 做左移、右移操作的结果,

图1 逻辑左移

图2 逻辑右移
2、如果是有符号数,

2a,如果是做左移运算,那么做的是“逻辑移位”,同 1中无符号数的左移。

2b,如果是做右移运算,那么做的是“算术移位”。

例如:

图3 负数的右移

图4 正数的右移
对于当前的大多数c/c++编译器来说,都是按照上面所讲实现的。

(2)文字描述篇,更深入。

1.左移

左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i = 1;
i = i << 2; //把i里的值左移2位

也就是说,1的2进制是000…0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000… 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面 解释原因)

需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,为2进制的01000000…0000
i = i << 1;

那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000…0000,符号位被置1,其他位全是0,变成了int类型所能表 示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢 弃了1之后,i的值变成了0.

左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.

总之左移就是: 丢弃最高位,0补最低位

2.右移

再说右移,明白了左移的道理,那么右移就比较好理解了.

右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.

右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

关于C/C++左移右移运算符的总结相关推荐

  1. c++ 左移/右移运算符总结

    c++ 左移/右移运算符总结 逻辑移位和算数移位 明确两种概念(逻辑移位和算数移位) 逻辑移位和算数移位有区别,仅针对于有符号整数的左移/右移运算,对于无符号整数,没有这两者运算之间的差距 无符号整数 ...

  2. java 左移 返回值_java左移右移运算符详解

    在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些 ...

  3. java中左移运算符解释_java左移右移运算符

    位运算(只对byte.short.char.int.long有效) 左移和右移运算相当于实现整数乘以或除以2的n次方 2.7三元运算符表达式1的结果为true时,就为第二个表达式,如果为...... ...

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

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

  5. c语言左移15位,关于c语言中左移右移运算符的问题

    参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...

  6. java 右移两位_java左移右移运算符

    http://blog.csdn.net/dandanteng/article/details/7433531 首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数 ...

  7. c语言左移右移运算符详解

    对于负数的右移:因为负数在内存中是以补码形式存在的,所以首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移 ...

  8. c语言负数左移右移_C语言 位运算符的运算规则

    位运算是指按照二进制进行的运算,在C语言中,提供了6种的位运算符,他们分别是按位与(&),按位或(|),按位异或(^),按位取反(-),左移(<)和右移(>).这些运算符只能用整型 ...

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

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

最新文章

  1. android框架连接mysql_Android:ROOM数据库框架
  2. VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装
  3. 在switch case 语句中能否使用continue 关键字?为什么?
  4. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
  5. 服务注册与发现用mysql_yeasul: 轻量级服务注册与发现中心,具有健康检查功能。...
  6. c语言exit_C语言实现2048
  7. 微信开发学习日记(六):weiphp框架
  8. BRD、MRD 和 PRD 之间的区别与联系有哪些?
  9. stl标准模板库_如何在C ++ STL(标准模板库)中使用Pair
  10. 关于分卷压缩文件打不开的问题
  11. 《逻辑学导论》(第11版)学习(一)
  12. 有道云词典--翻译/屏幕取词翻译
  13. win10+乌班图双系统安装(详细)
  14. php读取excel 报错_PHP读取Excel里的文件
  15. 芯唐语音识别_大联大品佳集团推出基于新唐科技的智能语音识别解决方案
  16. 应用未安装!安装包似乎已经损坏
  17. 电影《战狼》评论词云分析
  18. 关于多个债权人申请执行同一被执行人的清偿顺序问题
  19. CX3 调试学习_持续更新(此文大部分对于初步使用没啥用,回头去公众号整理一个精简版配置应用教程)
  20. eclipse 打不开,弹出一个框。

热门文章

  1. Matomo – 搭建一个属于自己的网站统计分析站点
  2. 大数据离线分析系统:统计网站PV、UV
  3. 码农 “家” 班神器分享:人体工学键盘、明基护眼显示器BL2480T…..
  4. 负载均衡的多种解决方案
  5. 热力灭菌之过热水灭菌
  6. 线性代数笔记3:向量投影
  7. 算法训练营 重编码_我们最成功的编码训练营学生共有的17个角色特征
  8. ipv6 压缩 java_IPv6 地址语法
  9. java中构造方法的概念和作用
  10. IDEMIA收购X Core Technologies的金属支付卡业务并推出Smart Metal Art产品