左移和右移都是位运算的概念。我们知道计算机是基于二进制保存数据的,因此左移和右移的概念十分重要。本文约定是32位的机器。

[左移] 丢弃最高位,0补最低位

左移是把一个数按照二进制每位向左移动若干位,在c语言中用运算符 << 表示。例如:

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

1对应的二进制数为000……0001(前面一共31个0),左移2位之后变成000……0100,在十进制下为4。所以看起来左移n位相当于乘以2的n次方。(有符号数不完全适用,因为左移有可能导致符号的变化,下面将给出解释)

需要注意的是,当左移结果超出数据类型所能表示的范围时,会出现溢出(产生数据丢失并造成结果错误)。我们知道,int是有符号的整型数,最高位是符号位,0表示正数,1表示负数。那么移位的时候就会出现溢出,例如:

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

这时候,x左移1位之后变成0x80000000,也就是2进制的1000……0000,符号位被置为1,变成了int型变量所能表示的最小值(因为负数是用补码表示的,计算补码:取反后加1),这个值在十进制下为-2147483648,我们成为溢出。如果把这个x再继续左移1位,那么最高位被丢弃,最低位补0,x的值就变成了0。这看起来是一件有意思的事情,由此可见,左移简单的理解为乘2的幂是不准确的。

左移中有一个比较特殊的情况,当左移的位数超过该数值类型的最大位数的时候,编译器会先用左移的位数对最大位数取模,然后按照余数进行移位计算。例如:

int x = 1, y = 0x80000000; //y的值在二进制下是1000……0000
x = x << 33; //33 % 32 = 1 左移1位,x变成2
y = y << 33; //33 % 32 = 1 左移1位,最高位被丢弃,y变成0
在用gcc编译这段程序的时候,编译器会给出一个warning,意思是 左移位数>=类型长度。事实上,上面这个例子x和y都是左移了1位,也就是33%32后的余数。(这个规则与编译器有关,不同的编译器可能处理方式不一样)
 
[右移] 丢弃最低位,符号补高位
右移的概念和左移正好相反,是指的向右移动若干位,在c语言中用运算符 << 表示。
 
相比较左移来说,右移稍稍复杂一点。我们分为 有符号整数 和 无符号整数 来说明。
 
对于无符号整数,右移可以直接看做是除以2的n次方的运算,且有整数除法的概念,低位移出去的位全部丢弃。举个简单的例子来说,十进制的5对应的二进制的表示为101,它右移1位得到的数会是2,也就是二进制表示的10,右端的1直接被丢弃掉了。
 
对于有符号整数,右移会保持符号位不变。例如:
int x = 0x80000000; //对应二进制的1000……0000
x = x >> 1; //x的值不会变成0x40000000(二进制的0100……0000),而是变成0xc0000000(二进制的1100……0000)

也就是说,符号位向右移动后,如果之前是正数,就在最高位补0;如果是负数,就在最高位补1(这样的方式还是与负数用补码存储有关)。这也是汇编语言中的算术右移。

同样的,当移动的位数超过类型的长度的时候,会先取余数,然后移动余数位。

这里值得指出的是,在c语言中,左移是逻辑/算数左移(两者完全相同),右移是算术右移,会保持符号位不变。

 

[c语言]左移和右移的更多相关文章

  1. 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...

  2. C语言位运算符:与、或、异或、取反,左移和右移

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

  3. C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

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

    C语言中的左移和右移运算符移位后的结果老是忘记,最近在刷有关位操作的题目,正好整理下:   1. 左移运算符(<<) 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指 ...

  5. [java基础] java 左移和右移

    今天搜到一个比较好用的在线编译器,希望和大家分享. 除了java还有c++....,地址是http://www.tutorialspoint.com/compile_java_online.php 另 ...

  6. 分析轮子(二)- << ,>>,>> (左移、右移、无符号右移)

    前言:写 分析轮子(一)-ArrayList.java 的时候看到源码中有 int newCapacity = oldCapacity + (oldCapacity >> 1); 这样的代 ...

  7. C++中的左移、右移运算

    移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift). 逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充. 算术移位:移出去的位 ...

  8. C# ListBox 左移、右移、上移、下移

    C# ListBox 左移.右移.上移.下移 2012-11-17 22:53:45|  分类: 技术研讨 |  标签:listbox  |字号 订阅     /// <summary>  ...

  9. WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移

    原文:WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移 代码:: <UserControl x:Class="SQ.TestPage" xmlns=" ...

随机推荐

  1. numpy中,从一片c_void_p指向的区域里获取数据

    以前采用的数据拷贝的笨办法: 1 bitmap_size = (1080, 1920, 3) 2 buf = create_string_buffer(bitmap_size[0]*bitmap_si ...

  2. 1000粉!使用Three.js制作一个专属3D奖牌🥇

    背景 破防了 !突然发现 SegmentFault 平台的粉丝数量已经突破 1000 了,它是我的三个博客平台掘金.博客园.SegmentFault中首个粉丝突破 1000 的,于是设计开发这个页面, ...

  3. vue学习10-计算属性

    计算属性 1 <!DOCTYPE html> 2 <html lang='en'> 3 <head> 4 <meta charset='UTF-8'> ...

  4. gin框架中的同步异步

    goroutine机制可以方便地实现异步处理 另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本 // 异步 func longAsync(context *gin.Co ...

  5. 免费注册香港Apple ID

    注册 一.海外Apple ID的好处 1.APP软件资源多,比如传说对决(海外版王者荣耀).海外版抖音等,这些APP软件在国内的apple store是没有的: 2.部分APP软件在海外Apple s ...

  6. 【webpack4.0】---webpack的基本使用(二)

    一.什么是plugins plugins可以使webpack在运行到某个时刻的时候,帮你做一些事情,类似于生命周期一样 plugins,它就是一个扩展器,它丰富了wepack本身,针对是loader结 ...

  7. nginx 和uwsgi的区别与作用

    在介绍nginx和uwsgi的区别和作用之前我们先介绍一下几个概念 1.WSGI WSGI的全称是Web Server Gateway Interface(Web服务器网关接口),它不是服务器.pyt ...

  8. 微信小程序之video组件与cover-view组件和cover-image组件灵活应用

    前言:最近忙着赶项目,没时间更博:希望和大家一起学习一起进步. 本人遇到的坑,以及爬出坑的方法:在某个微信小程序项目中,有这样一个需求:在滑块swiper组件和swiper-item组件中嵌套vide ...

  9. Zookeeper应用场景汇总(超详细)

    Zookeeper典型应用场景汇总 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  10. Android SDK:Android standard develop kits 安卓开发的工具集

    目前主流的安卓开发工具: 1.Adnroid-Adt-bundle SDK Manager.exe: Tools(安卓的开发小工具) 各种安卓版本 Extras 额外的开发包 在线更新/安装的安卓版本 ...