位运算|| 转自小胖的丘丘空间

来自这里


哈哈,全篇复制粘贴的。   一直比较弱,位运算和二进制方面,所以状压一直是很忧伤的一块。


要学些东西。。。发现位运算已经离我而去。。去网上找了下,虽然不是我写的,但是本来是Pascal语言

改C不容易啊,顺便加了最后一条~,大家给个掌声哈 

去掉最后一位              | (101101->10110) |          x>>1

在最后加一个0            | (101101->1011010) |       x<< 

在最后加一个1            | (101101->1011011) |       (x<<1)+1

把最后一位变成1          | (101100->101101) |        |

把最后一位变成0          | (101101->101100) |        (|1)-1  

最后一位取反               | (101101->101100) |        x^  

把右数第k位变成1         | (101001->101101,k=3) |     | (1 <<(k-1)) 

把右数第k位变成0         | (101101->101001,k=3) |     & ~(1<<(k-1))   

右数第k位取反            | (101001->101101,k=3) |    ^(1<<(k-1))   

取末三位                   | (1101101->101) |          &

取末k位                  | (1101101->1101,k=5) |     & (1<<k-1)   

取右数第k位              | (1101101->1,k=4) |        >> (k-1) &  

把末k位变成1            | (101001->101111,k=4) |     | (1 << k-1)   

k位取反                 | (101001->100110,k=4) |    ^(1 <<k-1)   

把右边连续的1变成      | (100101111->100100000) |   &(x+1)  

把右起第一个0变成      | (100101111->100111111) |    | (x+1)   

把右边连续的0变成      | (11011000->11011111) |      | (x-1)   

取右边连续的            | (100101111->1111) |        (x ^ (x+1)) >>  

去掉右起第一个1的左边     | (100101000->1000) |       & (x ^ (x-1)) 

取右边第一个1             | ( 10010->10) |             x&-x


//<<>>优先级比较高。。看的时候不注意就会觉得自己二。。。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值