一 两整形变量的平均值
这个算法利用了一个原理:(x+y) ,((x&y)+(x|y)) ,((x^y)+2*(x&y))这三个表达式的值相等。
对于两个int型的变量x、y。计算其平均值的一般是(x+y)/2 。然而,由于(x+y)有可能会发生溢出,而产生不正确的结果,一个比较隐晦的方法是使用(x&y)+((x^y)/2)。由于C语言不会说明这个转化是否是带符号的,因此这个表达式会有潜在的不可移植性。使用(x&y)+((x^y)>>1)可能是更加精简的。这两种方法的好处就是不会产生溢出。
二 bit位反转
将一个unsigned int型变量的bit位进行反转是比较麻烦的,这里提供一种32位bit(int类型为4字节)的反转算法。
unsigned int reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}
三 判断一个非负整数是否为2的幂
可以利用2的补码算数特性,来使用if( x & ( x-1 ) ) 进行判断。
四 不用临时变量交换两个整数的值
这个算法应该是比较常见了:
x ^= y; /* x' = (x^y) */
y ^= x; /* y' = (y^(x^y)) = x */
x ^= y; /* x' = (x^y)^x = y */
五 判断32位整数二进制中1的个数
1 这个问题http://www.everything2.com/index.pl?node_id=1181258有非常完整的总结
这个问题还有c++的解法,那就是使用c++模版元编程,这应该是运行期速度最快的方法了,因为在其计算在编译器已经完成了
template<size_t n>
struct count_1
{
enum{value=(n&1)+count_1<(n>>1)>::value;};
};
template<>
struct count_1<0>
{
enum {value=0;};
};
template<>
struct count_1<1>
{
enum {value=1;};
};
本文介绍了一系列实用的C语言编程技巧,包括计算整形变量平均值而不发生溢出的方法、实现位反转的高效算法、判断非负整数是否为2的幂、无需临时变量交换两个整数的值以及统计32位整数中1的个数。

2292

被折叠的 条评论
为什么被折叠?



