正整数: 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。
1192

被折叠的 条评论
为什么被折叠?



