C位运算右移

V站上看到的一个提问,有关C#和js的位运算不一致,实际上就是采用的右移不同。
C/C++语言中逻辑右移和算数右移共享同一个运算符>>。编译器决定使用逻辑右移还是算数右移,根据的是运算数的类型。如果运算数类型是unsigned则采用逻辑右移,而signed则采用算数右移。对于signed类型的数据,如果需要使用算数右移,或者unsigned类型的数据需要使用逻辑右移,都需要进行类型转换。

#include <stdio.h>

int main(){
    int a = 3233857544;
    unsigned int b = 3233857544;
    printf("%d\n", a);
    printf("%u\n", b);
    printf("a >> -171: %d\n", a>>-171);
    printf("b >> -171: %u\n", b>>-171);
    printf("a >> 21: %d\n", a>>21);
    printf("b >> 21: %u\n", b>>21);                           
    return 0;
}

RESULT

-1061109752
3233857544
a >> -171: -506
b >> -171: 1542
a >> 21: -506
b >> 21: 1542

其中位移量为负数
求 M>>a (a<0)

  1. 找到 n(n>=1), 令 2 ( n − 1 ) < ∣ a ∣ < = 2 n 2^{(n-1)}<|a|<=2^n 2(n1)<a<=2n
  2. b = 2 n − ∣ a ∣ b=2^n - |a| b=2na
  3. b = b mod 32(32 是 M 的位数,也有可能 64,由M类型决定)
  4. 则 M>>a == M>>b

比如 3233857544>>-171
找到比 171 大的第一个 2^n,是 256
256-171=85
85 mod 32 = 21
所以 3233857544>>-171 == 3233857544>>21

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值