有符号右移和无符号右移

计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负

有符号右移

若正数,高位补0,负数,高位补1 -> 一句话概括:高位补符号位

  1. 正数
    例如:8 >> 2
    偶数情况
    8的二进制为 0000 0000 0000 0000 0000 0000 0000 1000
    右移两位后 0000 0000 0000 0000 0000 0000 0000 0010
    结果为2,右移n位8/(2^n)

    如果是奇数呢
    9的二进制为 0000 0000 0000 0000 0000 0000 0000 1111
    右移两位后 0000 0000 0000 0000 0000 0000 0000 0011
    结果为3,右移n位近似等于9/(2^n)

  2. 负数
    -8的二进制为 1000 0000 0000 0000 0000 0000 0000 1000(原码)
    然后写出补码 1111 1111 1111 1111 1111 1111 1111 1000(补码)
    计算补码的方式为反码+1,用一句话概括就是:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)
    右移两位后 1111 1111 1111 1111 1111 1111 1111 1110(补码)
    1111 1111 1111 1111 1111 1111 1111 1111(补码+1)
    1000 0000 0000 0000 0000 0000 0000 0000(补码+1取反)
    根据补码写出原码才是我们所求的结果, 保留符号位,然后按位取反再加上1
    1000 0000 0000 0000 0000 0000 0000 0010(补码的补码,即原码)
    结果为:-2

无符号右移

不论正负,高位均补0

  1. 正数:
    例如8 >>> 2
    与8 >> 2的运算相同,结果也为1

  2. 负数:
    例如-8 >>> 2
    首先写出-8的二进制数,因为是负数所以最高位为1
    1000 0000 0000 0000 0000 0000 0000 1000

    然后写出-8补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)

    1111 1111 1111 1111 1111 1111 1111 1111 1000(补码)

    右移2位: 在高位补0

    0011 1111 1111 1111 1111 1111 1111 1111 1110

    结果为:即1073741822

  • 6
    点赞
  • 23
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

toprobust

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值