1
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
就是去数有多少个1,但是一位一位的遍历右移实在是太麻烦了,所以我们干脆直接在数字里面删掉1,由此产生了两种思路
方法1
删去最后面的1
1 | n&(n-1); |
这种做法恰好能删掉最后面的1
代码
1 | int ret = 0; |
方法2
删去最前面的1(lowbit操作)
1 | n-=(n&-n); |
n&-n的结果是n的最高位的1的位置,例如1110111,运算结果为1000000.
代码
1 | int ret = 0; |
2
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
根据2进制数的性质,2的幂次方的数只有最高位一个1,所以只需要判断除了最高位以外是否还含有其他的1.在这里就可以用lowbit操作。
1 | return n > 0 && (n & -n) == n; |
本文作者: jiangyuhao
本文链接: http://example.com/2022/03/24/%E4%BD%8D1%E7%9A%84%E4%B8%AA%E6%95%B0%E3%80%81%E4%BA%8C%E7%9A%84%E5%B9%82/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!