移动操作符的基本操作

从二进制的角度出发:

右移操作符>>:

#include<stdio.h>
int main()
{
    int a = 10;
    int b = a >> 2;
    printf("b=%d\n", b);
}

规则:右边抛弃,左边补0
针对一个正数10:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010
故推算出计算方法为:b = a / 2 ^ n;

左移运算符<<:

int main()
{
    int a = 10;
    int b = a << 2;
    printf("b=%d\n", b);
}

规则:左边抛弃,右边补0;

同样的例子10:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0010 1000
故推算出计算方法为:b = a * 2 ^ n;

提示:上述移位操作是针对正数而言成立

接下来以被移动的数为负数举例:

int main()
{
    int a = -10;
    int v = a >> 2;
    printf("v=%d", v);
}


对于数-10而言:
原码:    1000 0000 0000 0000 0000 0000 0000  1010
补码 :    1111 1111  1111  1111  1111  1111  1111  0101(第一位不变,其余取反)
右移后 : 1111 1111  1111  1111  1111  1111  1111  1101

对于右移而言分为两种情况如下:

正数右移补0:  +>> 0
负数右移补1:   - >> 1

故-10空缺的位置由1来填充,移位结束后进行转换:
补码 - 1后取反变原码:
1111  1111  1111  1111 1111  1111 1111  1100
1000 0000 0000 0000 0000 0000 0000 0011
故运行结果为 - 3

上述操作移动次数较少,若移动超过32,结果会是0吗?答案显然是否定的,通过运行调试,我们得出结论:

真实移动次数:移动次数 &%32;

若移动次数为负数:

int main()
{
    int a = 10;
    int v = a >> -1;//>>31
    int c = a << -2;//<<30
    printf("v=%d\n", v);
}

得出结论:若向右(左)移动一个负数,则相当于沿同一方向移动比特位(32)+(负数);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值