超高效解法
算法1
(位运算) 接近O(1)
时间复杂度分析:运算次数<32次 ,快于计算32次的解法
C++ 代码
#include <iostream>
using namespace std;
int cnt(int b){
int res = 0;
while (b>0) {
b = b & (b-1);
res++;
}
return res;
}
int main(){
int n, b;
cin >> n;
for (int i=0;i<n;i++) {
cin >> b;
cout << cnt(b)<<" ";
}
return 0;
}
讲讲 b = b & (b-1);吧 还有这个y总讲的 b-=b & -b;
while循环中 写成 b != 0好一点, 这样负数样例也能过,虽然 测试用例中 没有负数
运算次数小于32是什么意思?怎么算的啊
不由得让我惊叹!
卧槽,号玄乎的操作啊
简直精妙
太妙了
大佬可以讲解一下b&(b-1)是什么意思吗?
我试了一下,比如1010,每次通过b&(b-1)相当于去掉了最后面的一位1;
和y总的 x -= x&(-x) 达到的效果一样
对的,一个只保留最后一个 1,一个去掉最后一个 1,正好对称
&这个是什么意思
位运算的符号