一些bit算法妙用

本文介绍了一系列实用的C语言编程技巧,包括计算整形变量平均值而不发生溢出的方法、实现位反转的高效算法、判断非负整数是否为2的幂、无需临时变量交换两个整数的值以及统计32位整数中1的个数。

一 两整形变量的平均值

       这个算法利用了一个原理:(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;};
};


 

 

更多参考:http://aggregate.ee.engr.uky.edu/MAGIC/

http://graphics.stanford.edu/~seander/bithacks.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值