位操作求出integer的绝对值
来源:互联网 发布:ubuntu打开anaconda2 编辑:程序博客网 时间:2024/06/06 18:02
#include <iostream>int GetAbsoluteValue(int value){ int mask = value >> sizeof(int) - 1; return (value + mask) ^ mask;}int main(){ int res = GetAbsoluteValue(-4); std::cout << res << std::endl; return 0;};
步骤:
1. 将value移动31位,得到mask,
如果是负数则变为全1,(负数右移补0)1111....1111。
如果为正数则变为全0,0000....0000。
2. 将value + mask。
如果value为负数,则为value - 1。(1111....1111是-1)举个例子,假如是-5的话,减去1,就得到了5的反码,因为-5是5的反码加上1得来的。
如果value为正数,仍然得到value。
3. 异或操作 (value + mask) ^ mask。
如果value为负数,这时候要对(value + mask) 取反,mask这时也为全1,所以(value + mask) ^ mask,因为0于1异或为1,1与1异或为0。得到将反码取反的效果。
如果value为正数,这时相当于对value ^ mask,mask这时全为0,所以结果仍然为value,0, 1与0异或都为原数。
此算法来自斯坦福大学,原网址:http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
如需转载,请注明来自http://blog.csdn.net/leo524891010
- 位操作求出integer的绝对值
- 位操作之求绝对值
- 求出数组两两之差绝对值最小的值
- Integer位操作技巧解析
- Java Integer 位操作 reverse
- 用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。输出保留3位小数
- 用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数
- 用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数
- (C++)用迭代法求 。求平方根的迭代公式为: X[n+1]=1/2(X[n]+a/X[n]) 要求前后两次求出的得差的绝对值少于0.00001。 输出保留3位小数
- (面试题)求出两两之差绝对值最小的值
- Java Integer 位操作 numberOfTrailingZeros && numberOfLeadingZeros
- 用位运算求一个数的绝对值
- 求出32位整数左边第一位是1的算法
- 求出32位整数左边第一位是1的算法
- C/C++对一个整数求出每一位的数值
- 面试算法题:求出所有N位的二进制数
- 将integer的bit位翻转
- 反转整数的每一位(reverse integer)
- Linux上vi(vim)编辑器使用教程
- c# 读取excel文件的三种方法
- SDL入门教程(十):4、用iconv获得正确的Unicode,使用FriBiDi实现UTF-8到Unicode的正确转换
- SDL入门教程(十):5、SDL完美显示中文
- 获取语言ID
- 位操作求出integer的绝对值
- ACM中数论方面题目集
- SDL入门教程(十一):1、SurfaceClass类的再设计
- 蝴蝶兰与鳞托菊
- Codeforces Round #137 (Div. 2)
- Eclipse可以说的秘密
- 关于flex 和java上传是用FileReference 时候遇到的问题
- VS2010连接SQL Server 2008并执行查询操作
- SDL入门教程(十一):2、设计按钮ButtonClass