首页 > 编程知识 正文

在计算机中算术右移一位什么意思,二进制数左移一位相当于乘二右移一位相当于除以二

时间:2023-05-04 14:43:25 阅读:228707 作者:2013

二分查找中的中位数

在二分查找算法中,我们经常会写类似int mid = (left + right) / 2的操作,考虑周全一点的会写成int mid = left + (right - left) / 2形式,更加极客的则会写为int mid = left + ((right - left) >> 1),逐渐优秀。我们也认为右移的结果就是除以二,没有什么区别,今天刷题的过程中,遇到了问题,因为二分中左边界不是以0开始的,用了右移操作,一直报错,后来换成除法操作才解决问题。顺便就总结下右移和除二的区别,先看一下代码:

void test(){int value;while (!cin.eof()) {cout << "input value: ";cin >> value;cout << "value / 2: " << value / 2 << endl;cout << "value >>1: " << (value >> 1) << endl;// if (cin.eof()) break;}return;}

循环输入一个值,然后输出它的右移一位结果和除以二结果,这是我的测试结果(VS2015):

结果很清晰:

value为非负数或负偶数,移位操作和除法操作结果一致value为负奇数,移位操作和除法操作趋向不同 移位操作分析

正常除法:

-5 / 2 = -(int)2.5 = -2 // 由于类型转换发生截断

负奇数的右移一位:

首先,我们需要知道计算机中的数是按补码存放的,正数的补码和源码一致,负数的补码为源码取反再加1,还有前面的符号位,例如(为了简单,用4个bit存放一个小整数):

5 // 源码:0101 补码:0101-5// 源码:1101 补码:1011 注:符号位不参与变换

然后来看负奇数的右移操作:

-5 1011 -> 1101 // 1101 也是补码,对应的负数为 -3

也就是说,-5右移一位后并不是取到了-2,而是取到了-3,其它负奇数同理。再来看负偶数:

-6// 源码:1110 补码:1010// 进行右移一位操作:-6 1010 -> 1101 // 对应的负数为 -3

可以看到,负偶数移位没有问题

总结: 非负数和负偶数右移一位和除二结果一致负奇数除二是向上取整,右移一位是向下取整

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。