绝对值函数(位操作法)

int abs( int x ) { 
    int y ; 
    y = x > > 31 ; 
    return (x^y)-y ;//or: (x+y)^y 
}


一、先补充说明几个基础概念

1、现有的微机基本上都是32位操作系统,在此操作系统中,整数为32位;

2、右移运算为按位往右移的操作,右移1位时最右边的位被丢弃,最高位保持原值不变,其他位都被其左边一位所替换,32位的整数右移31位,即是保留其最高位符号位,即正数得0,负数得-1。如:整数7,其二进制为:0000 0000 0000 0000 0000 0000 0000 0111,右移1位则为:0000 0000 0000 0000 0000 0000 0000 0011,得值为3;

3、关于负数的二进制表示,计算机中负数存储时,不是简单的将符号位置为1,而是采用补码的形式存储的:负数最高位为符号位,也就是1,其余全部取反,然后再加1。

如-7的二进制存储不是:1000 0000 0000 0000 0000 0000 0000 0111,而是:1111 1111 1111 1111 1111 1111 1111 1000+1即1111 1111 1111 1111 1111 1111 1111 1001

4、异或运算^,即两个数按位进行异或,当两个数中相同位相同时结果值对应位为0,否则为1,如3^7,表示为:0011 ^ 0111,则异或后值为:0100 等于4。


二、有了以上基础概念,我们再来分析程序  

针对以上代码分析如下:

1、 y = x > > 31 ;//右移31位,只保留符号位,如果是负数,则是-1,其二进制为1111 1111 1111 1111 1111 1111 1111 1111,全为1,如果是正数,则全0

2、x^y//X与Y的异或运算,按位进行异或,当y=0时,实际上二者异或后运算的值保持不变,当Y=-1时,则实际上是将原值每位求反(1变成0,0变成1)

3、-y//当y为0时保持不变,为-1时,则表示加1,因此

(x^y)-y当Y=0时,表示保持x不变,当y=-1时,则表示将x各位求反后加1,实际上就是对该数求负,由于原来就是负数,因此就是变成正数。


本文链接绝对值函数(位操作法)

扩展阅读  C/C++位操作技巧

转载于:https://my.oschina.net/yumifan/blog/221890

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值