C语言中,关于&,^,!布尔代数,移位操作的一些巧妙算法

来源:互联网 发布:soapclient php 扩展 编辑:程序博客网 时间:2024/04/27 13:44

(1) 例如检查一个数X的第n位是否为1,我们可以通过下面的算法实现:

 int nBitCheck=(x&pow(2,n-1))/pow(2,n-1);如果返回的是1,则第n位为1,若果是0,则为0;

我们可以通过>>和<<运算符,可以建立位模式屏蔽掉某些位,检查x的第n位是否为1,

int nBitCheck=(x&(1<<n-1))>>(n-1);

(2)统计一个数X(一个字长16位)中1的个数,int bitCount(unsigned int x)

    n=0;

    for(i=1;i<=16;i++){ n+=(x&(1<<i-1)>>(i-1)); }

    return n;

}

还可以用下面的方法:

int bitCount(unsigned int x)

{

    unsigned int temp;

    temp=x-((x>>1)&033333333333)-((x>>2)&011111111111);

    return ((tmp+(tmp>>3))&030707070707)%63;

}

上面的你看懂了么!~是不是觉得很Magical!

(3)可以用^(异或)去实现两个数的交换,并且不需要额外的空间,可以拿来娱乐的小算法:

void swap_fun(int *x,int*y)

{

     *x=*x^*y;

     *y=*x^*y;

     *x=*x^*y;

}

/**

以上算法没经过实际测试,只是自己推导的

*/

原创粉丝点击