用位运算求整数的绝对值

在计算机中,所有运算都是采用补码方式进行计算的,正数的补码、反码和原码相同,负数的补码等于其反码+1

分析:假如负数为-13
    原码   0000 0000 0000 0000 0000 0000 1000 1101      
    反码   1111  1111  1111 1111 1111  1111  1111  0010
    补码   1111  1111  1111 1111 1111  1111  1111  0011
    ~        0000 0000 0000 0000 0000 0000 0000 1100 
    +1      0000 0000 0000 0000 0000 0000 0000 1101(13)

发现-13的补码取反+1就是13,所以一个负数n的绝对值为 :~n+1

public static int absoluteValue(int a){
    return (a >= 0) ? a : ~a + 1;
}

在分析:任何一个数异或0结果为其本身,与-1(二进制全为1)相当于取反,一个32bit的int类型的正数 >> 31结果为0,负数 >> 31为-1,所以

public static int absoluteValue(int a){
    int b = a >> 31;
    // 当a为正时:b = 0,a ^ b = a;
    // 当a为负时:b = -1,a ^ b = ~a;
    return (a ^ b) - b;// 也可以写为:(a ^ (a >> 31)) - (a >> 31)
}

注意:算术运算符优先级比位运算符高

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值