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

(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;

}

/**

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

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值