C语言 ---- 左移、右移、逻辑右移、算数右移

左移:丢弃最高位,往左移位,右边空出来的位置补0
右移:右移有逻辑右移和算数右移
逻辑右移:丢弃最低位,向右移位,左边空出来的位置补0
算数右移:丢弃最低位,向右移位,左边空出来的位置补原来的符号位(即补最高位)

一、算数右移

int a = 1;
unsigned int b = (a << 31) >> 31;

整型a:0000 0000 0000 0000 0000 0000 0000 0001
左移31位后:10000000 00000000 00000000 00000000 最右侧直接补0
右移31位后: 11111111 11111111 11111111 11111111 a是有符号数,采用算术右移,最左侧补符号位,即1
最终b等于0xFFFFFFFF

二、逻辑右移

unsigned int a = 1;
unsigned int b = (a << 31) >> 31;

整型a: 00000000 00000000 00000000 00000001
左移31位后:10000000 00000000 00000000 00000000 最右侧直接补0
右移31位后:00000000 00000000 00000000 00000001 a是无符号数,采用逻辑右移,最左侧补0

三、移动的位数超过数字占有的位数

unsigned int a = 1;
unsigned int b = a << 33;

实际移动位数为 33 % 32 = 1,即左移1位,b = 2

参考文章:https://blog.csdn.net/yzf279533105/article/details/58642142?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.nonecase

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值