您的位置:首页 > 其它

不使用abs通过位移来实现取一个整数的绝对值

2014-12-08 14:57 204 查看
在32位机上若不用系统的函数及条件语句可以使用以下函数实现取绝对值:

int myabs(int n)

{

return n * ((n>>31<<1) +1);

}

自己一开始没有看懂,好久没有搞原码、反码、和补码的东西,趁着今天温习一遍。

首先要知道补码是在原码基础上变为反码,之后再加一得到的,反之可以通过补码得到原码。

举个例子:-4和4

如果传入的是一个正数4,补码和原码是一样的都是:00....0100,在n>>31右移31位之后变成00....0000,再左移1位还是00....0000,之后的运算其实就是返回了(4*1)

如果传入的是一个负数4,补码和原码是不一样的,原码是:00....0100,补码是:11....1100(负数的话右移在高位补的不是0而是1),在n>>31右移31位之后变成,11....1111,再左移1位还是11....1110(正数和负数的话左移在低位补的都是0),根据这个补码变成原码就是:10....0010,其实就是-2,之后的运算其实就是返回了(-4*-1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐