不使用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)
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)
相关文章推荐
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个
- MF中使用GPRS:如何通过一个串口终端实现GPRS Modem拨号上网
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view 上(相当于所有界面都通过xib来实现)
- 创建存储过程,以部门编号为参数返回该部门的人数及平均工资(返回一个值可以通过函数来实现,但如果要返回多个值,需要使用out或in out模式参数实现)
- 【C语言】使用main函数的参数,实现一个整数计算器
- c语言:使用main函数的参数,实现一个整数计算器
- MF中使用GPRS:如何通过一个串口终端实现GPRS Modem拨号上网
- c++实现写一个函数,求2个整数的和,要求在函数体内不得使用+,-* /
- 1、使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数
- C语言:使用main函数的参数,实现一个整数计算机。
- 使用main函数的参数,实现一个整数计算器
- 请问如何避免用判断来实现求一个整数的绝对值
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.
- 简介 WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对
- 【C语言】【面试题】使用main函数的参数,实现一个整数计算机,程序可以接受三个参数
- 实现中缀整数表达式求值--使用数组实现,在数组头处一个栈,在数组尾部有另一个栈
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view 上(相当于所有界面都通过xib来实现)
- 【C语言】【面试题】【笔试题】使用main函数实现一个整数计算器!