c 语言中 的左移右移
先说左移,左移就是把一个数的所有位都向左移动若干位,在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补最低位
再说右移,明白了左移的道理,那么右移就比较好理解了.
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110 >>5(假设字长为8位),则得到的是 11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
c 语言中 的左移右移相关推荐
- 单片机c语言左移的作用,[转载]单片机c语言中的左移右移
单片机c语言中的左移右移 左移 变量1 << 变量2 将变量1的二进制位值向左移动由变量2所指定的位数. 例如: a = 0x8f; // 10001111 a << 2; / ...
- 单片机c语言左移的作用,单片机c语言中的左移右移
// 据说有些编译器采用逻辑右移,即左端补0 结果:a = 0xe3 (11100011) 1当左移移出的是"1"而不是0时,你该怎么想? 2 当左移的操作数是一个sign型是,你 ...
- c语言的左移运算,C语言中的左移和右移运算.docx
C 语言中的左移和右移运算 C 语言中的左移和右移运算 (>> 和 < 1.各种数据格式(整型int ,字符型 char 等)占有几个存储单元(不同的编译器有所不同) 在TC2.0和 ...
- C语言中的左移与右移[转]
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...
- C语言中的左移与右移
原文地址http://www.cnblogs.com/myblesh/articles/2431806.html 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例 ...
- 计算机原理与基础 —— C语言中的左移与右移
1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8 >> 3 (意思是8向右移动3 ...
- 关于C语言中的左移与右移
总结 ** 1. 左移时总是移位和补零,无论是有符号类型数据还是无符号类型数据都统称为逻辑左移. 2. 右移时无符号数是移位和补零,此时称为逻辑右移; 3. 右移时而有符号数大多数情况下是移位和补最左 ...
- c语言中左移一位 由什么补充,计算机原理与基础 —— C语言中的左移与右移
1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8 >> 3 (意思是8向右移动3 ...
- java右移位_java中的左移 右移
1. 左移运算符 左移运算符< 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果 ...
最新文章
- 千位亿万富豪调研:六成富豪担心继承人婚姻问题致财富外流
- 【S操作】老铁留步,干货来了!小总结云存储云办公云笔记工具——我的云工具选择,供您参考...
- 【转】根据起止日期+时间取数
- Netbeans自定义mode
- oracle大批量数据统计,加速Oracle大批量数据处理的2个好用方案
- Maven--反应堆(Reactor)
- python 3.7.732位安装步骤_Python3.7安装pyaudio教程解析
- 华为出售荣耀为不实消息,赵明曾在内部否认;迅雷前CEO陈磊涉嫌职务侵占罪被调查 ;Python 3.9发布|极客头条...
- input 单击 图标_input添加小图标
- MySQL----下载安装
- pytorch_图片分类_猫狗猴
- log4j使用和配置详解
- kafka+线程池+Runnable
- java yyyymmddThhmiss_如何在Javascript中以mm-dd-hh格式获取两个日期的差
- LintCode 交叉字符串
- 17个改变世界的数学公式!
- 大数据技术之Hive 第6章 查询
- 原生Javascript实现拼图游戏
- 电脑蓝屏错误代码0x0000007e的解决方法
- Python 包管理工具:pip 用法详解 + 常用pip指令
热门文章
- 如何投稿SCI收录杂志论文
- CAN通信帧ID的确定
- “趁热喝”竟会致癌?美公布十大癌症候选人名单
- 深度净化自来水,还支持即时加热,爱贝源R3桌面净水机体验
- python积木式编程_【发现教育版亮点之美】3D One还能这么玩:“趣味编程”建模让你脑洞大开...
- win7计算机用户配置文件存储路径,Windows下的用户配置文件管理(一)
- c语言strlen函数的原型及用法
- 快乐地打牢基础(13)——普通型母函数和指数型母函数的应用
- excel 如何固定第一行字段
- 怎么允许键盘鼠标唤醒计算机,Win10系统开启或者关闭键盘鼠标的唤醒电脑功能的方法...