提高算法性能——位运算
2009-03-22 16:44
176 查看
转自:编程论坛 http://bbs.bccn.net/thread-252089-1-2.html
这篇文章很强大,虽然c#不推荐用指针,还是很爽的
之后还有一篇matrix67大大的文章,更加强大
----------------------------------------------------------------------------------------------------------------------------------------------
前面的基数排序一帖中,有几处语句用到了位运算,不大好理解。查了很多资料,又经过sunkaidong版主的讲解
总算弄明白了...现将查的资料总结一下,希望对大家有帮助。
1.判断一个整数是不是2的幂
十进制 二进制
2^0 == 1 0000 0001
2^1 == 2 0000 0010
2^2 == 4 0000 0100
2^3 == 8 0000 1000
2^4 == 16 0001 0000
2^5 == 32 0010 0000
从上述规律中我们可以得出,题目最终归结为判断此数的二进制表示中是否只有一位为1
bool IsPowerTwo(int x)
{
return ((x&(x-1))==0)&&x;
}
2.不用临时变量,交换两个整数
1 /***证明:
2 b=(a^b)^b=a^(b^b)=a^0=a;
3 a=(a^b)^((a^b)^b)=(a^b)^a=a^(a^b)=(a^a)^b=0^b=b;
4 *********************/
5 void Swap(int& a,int& b)
6 {
7 a ^= b;
8 b ^= a;
9 a ^= b;
}
3.计算绝对值
1 /**
2 x>0,y=x>>31==0,(x^y)-y==x
3 x<0,y=x>>31==0xffffffff,(x^y)-y为x变反后加1,即为绝对值
4 */
5 int Abs(int x)
6 { //计算整型绝对值
7 int y ;
8 y = x >> 31 ;
9 return (x^y)-y ; //或(x+y)^y
}
/**
x>0,符号位0,与0后不变,
x<0,符号位1,与0后变反
*/
double Abs(double x)
{//计算浮点型绝对值
double y = x;
*(((int *)&y)+1)&=0x7fffffff;
return y;
}
4.不用判断语句,求两整数的最大最小值
1 /****
2 道理和计算整型绝对值相似
3 */
4 int Min(int a, int b)
5 {
6 int diff = b - a;
7 return a + (diff & (diff >> 31));
8 }
9 int Max(int a, int b)
{
int diff = b - a;
return b - (diff & (diff >> 31));
}
位运算往往能缩短代码长度,提高算法性能,但也会让代码变得难以理解,建议合理利用。
这篇文章很强大,虽然c#不推荐用指针,还是很爽的
之后还有一篇matrix67大大的文章,更加强大
----------------------------------------------------------------------------------------------------------------------------------------------
前面的基数排序一帖中,有几处语句用到了位运算,不大好理解。查了很多资料,又经过sunkaidong版主的讲解
总算弄明白了...现将查的资料总结一下,希望对大家有帮助。
1.判断一个整数是不是2的幂
十进制 二进制
2^0 == 1 0000 0001
2^1 == 2 0000 0010
2^2 == 4 0000 0100
2^3 == 8 0000 1000
2^4 == 16 0001 0000
2^5 == 32 0010 0000
从上述规律中我们可以得出,题目最终归结为判断此数的二进制表示中是否只有一位为1
bool IsPowerTwo(int x)
{
return ((x&(x-1))==0)&&x;
}
2.不用临时变量,交换两个整数
1 /***证明:
2 b=(a^b)^b=a^(b^b)=a^0=a;
3 a=(a^b)^((a^b)^b)=(a^b)^a=a^(a^b)=(a^a)^b=0^b=b;
4 *********************/
5 void Swap(int& a,int& b)
6 {
7 a ^= b;
8 b ^= a;
9 a ^= b;
}
3.计算绝对值
1 /**
2 x>0,y=x>>31==0,(x^y)-y==x
3 x<0,y=x>>31==0xffffffff,(x^y)-y为x变反后加1,即为绝对值
4 */
5 int Abs(int x)
6 { //计算整型绝对值
7 int y ;
8 y = x >> 31 ;
9 return (x^y)-y ; //或(x+y)^y
}
/**
x>0,符号位0,与0后不变,
x<0,符号位1,与0后变反
*/
double Abs(double x)
{//计算浮点型绝对值
double y = x;
*(((int *)&y)+1)&=0x7fffffff;
return y;
}
4.不用判断语句,求两整数的最大最小值
1 /****
2 道理和计算整型绝对值相似
3 */
4 int Min(int a, int b)
5 {
6 int diff = b - a;
7 return a + (diff & (diff >> 31));
8 }
9 int Max(int a, int b)
{
int diff = b - a;
return b - (diff & (diff >> 31));
}
位运算往往能缩短代码长度,提高算法性能,但也会让代码变得难以理解,建议合理利用。
相关文章推荐
- 提高算法性能——位运算
- 第十章 10.2 提高聚类性能 10.3 二分K-均值算法
- 算法和机器性能提高带来输入规模增大的比较
- 《机器学习实战》笔记之七——利用AdaBoost元算法提高分类性能
- 通过时间与空间转换来提高算法性能
- 机器学习实战第七章 - 利用AdaBoost元算法提高分类性能
- [完]机器学习实战 第七章 利用AdaBoost元算法提高分类性能
- 第七章 利用AdaBoost元算法提高分类性能
- 读书笔记:机器学习实战【第7章:利用Adaboost元算法提高分类性能】
- 《机器学习实战》笔记之七——利用AdaBoost元算法提高分类性能
- 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
- 使用缓存来提高开发性能 - 算法优化
- 利用AdaBoost元算法提高分类性能
- 使用 AdaBoost 元算法提高分类器性能
- 利用AdaBoost元算法提高分类性能
- 一种快速碰撞检测算法提高虚拟装配仿真性能
- 机器学习实战笔记-利用AdaBoost元算法提高分类性能
- 代码注释:机器学习实战第7章 利用AdaBoost元算法提高分类性能
- 《机器学习实战》笔记之七——利用AdaBoost元算法提高分类性能
- 机器学习实战——利用AdaBoost元算法提高分类性能