c++的左移、右移的功能

蓝鲸 2018-11-24 04:31:53
左移:<<i 相当于乘了2的i次方倍
右移:>>j 相当于除了2的i次方倍
...全文
1775 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
微笑的花 2019-01-09
  • 打赏
  • 举报
回复
也就是在不溢出和不修改符号位的前提下吧
赵4老师 2018-12-27
  • 打赏
  • 举报
回复
#include <stdio.h>
unsigned short int ui;
signed short int si;
int main() {
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui>>1;
si=si>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);

printf("--------------\n");
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed short int)ui)>>1;
si=((unsigned short int)si)>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);

return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384
独孤过 2018-12-27
  • 打赏
  • 举报
回复
在没有溢出情况下左移结果没问题,而右移会有区别。 举个例子,9和-9左移一位分别是18和-18,右移一位分别是4和-5。 再举个例子,8和-8左移一位分别是16和-16,右移一位分别是4和-4。 应该不难看出规律。
zhouqunhai 2018-12-27
  • 打赏
  • 举报
回复
需考虑数据溢出的情况
CRongQ 2018-12-27
  • 打赏
  • 举报
回复
就拿上一个答主回答的例子:
-5/2 和 -5>>1结果不一样,-5/2=-2;
-----------------
正数5:
1.把5转换为二进制:
0000 0000 0000 0000 0000 0000 0000 0101
2.向右位移(最左边添加一位0,最右边去一位):
000 0000 0000 0000 0000 0000 0000 0010
------------------
负数-5:
1.把-5转换为二进制:
1000 0000 0000 0000 0000 0000 0000 0101
2.取反:
1111 1111 1111 1111 1111 1111 1111 1010
3.加1:
1111 1111 1111 1111 1111 1111 1111 1011
4.位移(最左边补一位1,最右边边去一位):
1111 1111 1111 1111 1111 1111 1111 1101
---------------------------------------------------------------
如果是 unsigned int类型:
正数:与前面一样。
----------------------
负数:
位移:最左边补一位0,最右边去一位。
0111 1111 1111 1111 1111 1111 1111 1101
--------------------------------------------------------------
附加测试代码:
#include<iostream>
using namespace std;

int main()
{
//-------int 正整数----------------
int a = 5;
printf("%0x\n", a);
a=(a >> 1);
printf("%0x", a);
printf("\n");
//------int 负整数----------------
int b = -5;
printf("%0x\n", b);
b = (b >> 1);
printf("%0x", b);
printf("\n");
//------unsigned 正整数------------
unsigned int c = 5;
printf("%0x\n", c);
c = (c >> 1);
printf("%0x", c);
printf("\n");
//------unsigned 负整数------------
unsigned int d = -5;
printf("%0x\n", d);
d = (d >> 1);
printf("%0x", d);
return 0;

}


我在地球 2018-11-29
  • 打赏
  • 举报
回复
碰巧对了。架构可能导致结果不同。
轻箬笠 2018-11-27
  • 打赏
  • 举报
回复
来接分,看样子楼主只是想记录下学习的过程
lin5161678 2018-11-27
  • 打赏
  • 举报
回复
引用 7 楼 AlbertS 的回复:
[quote=引用 5 楼 lin5161678 的回复:]
[quote=引用 4 楼 AlbertS 的回复:]
没毛病,前提在数据不溢出的情况下


引用 3 楼 niiiloc 的回复:
在数据不溢出的情况下是可以这么理解的

不溢出也有毛病的[/quote]
说来听听[/quote]
-5/2 和 -5>>1
结果不一样
AlbertS 2018-11-27
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
[quote=引用 4 楼 AlbertS 的回复:]
没毛病,前提在数据不溢出的情况下


引用 3 楼 niiiloc 的回复:
在数据不溢出的情况下是可以这么理解的

不溢出也有毛病的[/quote]
说来听听
lin5161678 2018-11-26
  • 打赏
  • 举报
回复 1
引用 4 楼 AlbertS 的回复:
没毛病,前提在数据不溢出的情况下


引用 3 楼 niiiloc 的回复:
在数据不溢出的情况下是可以这么理解的

不溢出也有毛病的
AlbertS 2018-11-26
  • 打赏
  • 举报
回复
没毛病,前提在数据不溢出的情况下
636f6c696e 2018-11-26
  • 打赏
  • 举报
回复
在数据不溢出的情况下是可以这么理解的
自信男孩 2018-11-26
  • 打赏
  • 举报
回复
注意移位操作符号问题,比如1<<31位,对于有符号数最高位是符号位。注意移位操作的越界问题,比如1u << 32。并不是所有的移位操作都遵循你说的规律。
要注意前提条件。
1000sakura 2018-11-24
  • 打赏
  • 举报
回复
因为数据是二进制保存的,所以是x2和/2,如果数据十进制存储的话就是x10和/10。简单来说左右移相当于小数点的右左移动。
lin5161678 2018-11-24
  • 打赏
  • 举报
回复
不知道你的问题是什么
顺便说一句 你的想法是错的
移位 和 乘除 不能直接等同
只是部分计算结果恰好相等而已
移位还是按照移位的规则理解
不要参考乘除

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧