常用位运算技巧总结

正整数: n

1.取n的二进制形式的第i位

计算公式: ( n & (1 << i) ) >> i

设定n二进制形式的末尾位的索引位0,取n的末尾位就是( n & (1 << 0) ) >> 0即n&1。

取n的索引为2的位即( n & (1 << 2) ) >> 2即n&("100")后再右移2位,将要获取的索引位的值移到末尾,就可以根据结果是0还是1就可以知道索引位的值是0还是1。

2.设置n的二进制形式的第i位为1

计算公式: n | (1 << i)

设定n二进制形式的末尾位的索引位0,则将n的二进制形式第i位设置为1的话,只需要将1左移i位,变成1000...的二进制形式,然后将n与其做或运算,就可以把n的第i位位置变为1。

假设n=9,即1001,将其索引位1的位置变为1,则有如下计算:

1001        n=9

0100      1 << 2

1101       n | (1 << 2) = 13

3.判断n的奇偶性

计算公式: n & 1 == 1

因为奇数n的二进制末尾位为1,而偶数位末尾位为0,因此用n&1取n的末尾位并判断是否是1就可能知道n是否是奇数

比如:

n=5       1001        奇数

n=8       1000        偶数

4.lowbit

计算公式: lowbit(n) = n & (-n)

该方法可以计算正整数n在二进制表示下最低位的1及其后续0构成的数值,也就是二进制最低有效位lsb,(如lowbit(14)=2,二进制1110的最低位1即二进制10对应2)。


因为-n即n的反码加1,即上面的计算公式可以转化为n & ((~n)+1),而n的反码与n完全相反,那么n的最低位1及之后的0即1000...的形式反码后变成0111...,
再加1之后就会变成和n完全一样的1000...。这样的话,最低位1之前的部分和n完全相反,最低位1之后的部分和n完全一样,那&运算后得到的就是最低位1及之后的0构成的数值。

1000...         n
0111...        ~n
1000...       (~n)+1即-n

1000...          n & (-n)


则上面的n=14时,计算lowbit(14)=2的过程就是如下

1110      n=14    
0001      ~n
0010    -n=(~n)+1

0010    n & (-n)=2

5.求含有n个整数的数组的子序列数量

计算公式: count = 1 << n

原理就是以将子序列看成是完整数组的二进制表示,即对于完整数组每个元素在子序列中是否存在可用1/0表示,
即n等于3的时候子序列的各种可能就是[_, _, _]三个空位上分别取0或1的组合,每个位置都有2种可能,则总共的组合数量就是2 ^ 3 = 1 << 3 = 8。

例如,数组nums = [1, 2, 3],n=3,则子序列共有八种:

000:[]
001:[3]
010:‌[2]
011:[2,3]
100:‌[1]
101:[1,3]
110:[1,2]
111:[1,2,3]

即count = 2 ^ 3 = 1 << 3 = 8。

如果是求非空子序列数量的话再减去1就行,即count = (1 << n) - 1。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值