C语言中左移右移运算规则
https://blog.csdn.net/u012745229/article/details/51405332
左移
int i=1;i=i<<2;//把i里面的值左移2位
- 1
- 2
1的2进制是
000…0001
(这里前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成:
000…0100,
也就是10进制的4,所以说左移1位相对于乘以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
- 1
- 2
- 3
- 4
左移里面一个比较特殊的情况是当左移动的位数超过该数值类型的最大位数时,编译器会用左移的位数区模类型的最大位数,如
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,最高为被丢弃
- 1
- 2
- 3
总之左移就是: 丢弃最高位,0补最低位
右移
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如
int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
- 1
- 2
- 就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
- 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.
-5>>3=-1
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1111 1111
其结果与 Math.floor((double)-5/(2*2*2)) 完全相同。-5<<3=-40
1111 1111 1111 1111 1111 1111 1111 1011
1111 1111 1111 1111 1111 1111 1101 1000
其结果与 -5*2*2*2 完全相同。5>>3=0
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0000 0000
其结果与 5/(2*2*2) 完全相同。5<<3=40
0000 0000 0000 0000 0000 0000 0000 0101
0000 0000 0000 0000 0000 0000 0010 1000
其结果与 5*2*2*2 完全相同。-5>>>3=536870911
1111 1111 1111 1111 1111 1111 1111 1011
0001 1111 1111 1111 1111 1111 1111 1111无论正数、负数,它们的右移、左移、无符号右移 32 位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5。
一个有趣的现象是,把 1 左移 31 位再右移 31 位,其结果为 -1。
0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111对于10进制的数字,左移一位就是在末尾加上一个0,数值变大10倍。
同理,对于二进制数字,左移一位是在末尾加上一个0,数值变大2被。
所以 x << 3,x就变大 2^3 倍,就是 8*x
右移同理 一般情况下你要乘或者是除以数字是2的次方的话都可以用的
执行速度快
C语言中左移右移运算规则相关推荐
- c语言左移15位,关于c语言中左移右移运算符的问题
参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...
- c语言中左移右移有什么作用,C语言中左移和右移运算符详细介绍
搜索热词 C语言中左移和右移运算符详细介绍 左移运算符(< 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出 ...
- C语言编程技巧 --- C语言中左移右移与乘除法的比较
C语言中右移与除法的比较 最近在做项目的时候,遇到了一个有趣的现象.那就是,对于除2的整数次幂的操作而言,为了加快计算速度,一般情况下,会用右移(>>)来替代除法(/).但实际上,在VS中 ...
- c语言中左移一位 由什么补充,计算机原理与基础 —— C语言中的左移与右移
1.双目运算符 位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算. 位移位运算符分为左移和右移两种,均为双目运算符. 例如: 8 >> 3 (意思是8向右移动3 ...
- c语言负数左移右移_C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
- c语言负数左移右移_C语言里的左移和右移运算
C语言里的左移和右移运算 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如:int i = 1;i = i 2; /把i里的值左移2位也就是说,1的2进制是000.0001(这 ...
- c语言负数左移右移_C语言左移和右移
事情的发生: 某日工作中有个需求是将不同的数值存到char的前4位和后4位中. 恰好同事中有同样取得32位int的前8位当成一个数值的代码: //取得32位中的高八位组成的值 #define U32_ ...
- c语言右移高位如何补1,c语言负数左移右移
事情的发生: 某日工作中有个需求是将不同的数值存到char的前4位和后4位中. 恰好同事中有同样取得32位int的前8位当成一个数值的代码: //取得32位中的高八位组成的值 #define U32_ ...
- c语言负数左移右移_C语言 位运算符的运算规则
位运算是指按照二进制进行的运算,在C语言中,提供了6种的位运算符,他们分别是按位与(&),按位或(|),按位异或(^),按位取反(-),左移(<)和右移(>).这些运算符只能用整型 ...
最新文章
- ui产品小结 - 包含小程序 前端等
- 微生物预测年龄,皮肤比肠道更准确
- 史上第二走心的 iOS11 Drag Drop 教程
- 关于for循环处理列表的思考
- Android开发之Gradle多渠道打包总结
- 六款小巧的HTTP Server[C语言] - 贵贵的博客 - 开发|架构|开源|共享
- MS CRM 2011 Field Security Profile
- python 判断数字序列是否合法_Python:检查对象是否是序列
- python 多帧 超分辨_利用python-opencv生成视频帧数控制,和常见错误总结
- maven项目引用新模块,依赖的jar包与新模块中的jar包版本不一致
- Java PreparedStatement IN子句替代
- 老K整理|4月|物流技术圈职位招聘合集!
- 计算机操作系统(第四版) 汤小丹 配套资源
- iOS里的动态库和静态库
- 《山月记》一定有那么一刻,我们曾迷茫怀疑
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- Socket通信实例详解
- 前端练习--京东导航
- 解读 ESP32 API参考-system-App Image Format
- 反射调用目标异常可能原因之一解决java.lang.reflect.InvocationTargetException