位运算常用技巧

1、获得第 i 位的数字

(a>>i)&1

2、设置第 i 位为 1

a=a|(1<<i)

3、设置第 i 位为 0

a=a&(~(1<<i))

4、把第 i 位取反

a=a^(1<<i)

5、lowbit函数(用来取一个二进制最低位的1与后边的 0 组成的数 )

方法一:  a&(-a) ,原理:二进制数的负数是正数取反加一

方法二: a - ( a & (a-1) ),原理: 先消掉最后一位1,然后再用原数减去消掉最后一位 1 后的数

6、把最后一个1变成0

x=x&(x−1)

7、判断一个正整数是不是 2的整数次幂

if ((i & (i - 1)) == 0)

8、判断奇偶数

if(0 == (a & 1)) {
 //偶数
}

9、交换符号:正数变负数,负数变正数

int reversal(int a) {
  return ~a + 1;//整数取反加 1,正好变成其对应的负数 (补码表示);负数取反加一,则变为其原码,即正数
}

10、求绝对值

//整数的绝对值是其本身,负数的绝对值正好可以对其进行取反加一求得,即我们首先判断其符号位(整数右移 31 位得到 0,负数右移 31 位得到 -1, 即 0xffffffff),然后根据符号进行相应的操作
int abs2(int a) {
  int i = a >> 31;//取符号位
  return ((a^i) - i);//整数时 a 与 0 异或得到本身,再减去 0,负数时与 0xffffffff 异或将 a 进行取反,然后在加上 1,即减去 i (i =-1)
}

 

参考:

https://blog.youkuaiyun.com/han_hhh/article/details/82432316

https://www.cnblogs.com/liubilan/p/9457083.html

https://www.zhihu.com/question/38206659/answer/736472332

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值