小技巧,计算一个十进制整数在二进制下“1”的个数
2017-12-29 11:11
330 查看
在写百度之星的时候遇到这个困难,要查看被压缩的状态里,有几个已处理的对象。c++里可以用一个函数来解决,但是运算复杂度高,在多组数据时没有优势,而且在高中竞赛中也禁止使用。
所以我写了一个预处理,处理出数据范围内所有数在二进制下有几个1,并存进数组里。
想法
ans->0
对每个数都mod 2,如果为1,则ans++;//即查看每位上是否为2
最后ans->0
循环以上步骤计算出所有数
有n个数
每个数i计算logi次
n
∑logi
i=1
复杂度:O(nlogn)
后来在大佬的指点下,发现了可以用递推
计算count[a]的时候只要count[a>>1]计算出来了,那么如果a二进制下的末位为1,结果加1,否则不变
a>>1是位运算,就是把a在二进制下直接向右移,那么它的最后一位就没了。
example
101001111我们要计算它的1的个数,只要把10100111的1的个数加一就好了
101001110我们要计算它的1的个数,它是等于10100111的
那么我们的程序就出来了#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int count[1<<16];
for(int i=1;i<=(1<<16);i++)
{
if((i&1)==0)
count[i]=count[i>>1];
else
count[i]=count[(i>>1)]+1;
//cout<<i<<" "<<count[i]<<endl;
//system("pause");
}
}
这里有一个&运算,可能有人不懂
&就是把两个数在二进制下,每一位进行与运算,a&1就可以知道a的最后一位是什么
所以我写了一个预处理,处理出数据范围内所有数在二进制下有几个1,并存进数组里。
想法
ans->0
对每个数都mod 2,如果为1,则ans++;//即查看每位上是否为2
最后ans->0
循环以上步骤计算出所有数
有n个数
每个数i计算logi次
n
∑logi
i=1
复杂度:O(nlogn)
后来在大佬的指点下,发现了可以用递推
计算count[a]的时候只要count[a>>1]计算出来了,那么如果a二进制下的末位为1,结果加1,否则不变
a>>1是位运算,就是把a在二进制下直接向右移,那么它的最后一位就没了。
example
101001111我们要计算它的1的个数,只要把10100111的1的个数加一就好了
101001110我们要计算它的1的个数,它是等于10100111的
那么我们的程序就出来了#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
int count[1<<16];
for(int i=1;i<=(1<<16);i++)
{
if((i&1)==0)
count[i]=count[i>>1];
else
count[i]=count[(i>>1)]+1;
//cout<<i<<" "<<count[i]<<endl;
//system("pause");
}
}
这里有一个&运算,可能有人不懂
&就是把两个数在二进制下,每一位进行与运算,a&1就可以知道a的最后一位是什么
相关文章推荐
- 计算将一个十进制整数转换成二进制含多少个1
- 计算将一个十进制整数转换成二进制含多少个1
- 输入一个十进制整数,统计其中二进制1的个数
- 求一个十进制正整数在二进制表示中的二进制数字个数
- 计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。
- 计算十进制整数的二进制中的1的数目
- 输入一个十进制整数,统计其中二进制1的个数
- 剑指offer——面试题10输入一个十进制整数,统计其中二进制1的个数
- 一个整数的二进制序列倒置后再转换为十进制的整数
- 计算一个整数二进制中1的个数
- 剑指offer——面试题10输入一个十进制整数,统计其中二进制1的个数
- Bit Manipulation-计算一个整数中二进制中1的个数
- 【原】计算一个整数二进制中的1个个数
- 191. Number of 1 Bits (计算一个整数的二进制表示中有多少个1)
- 给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数
- 一个函数把十进制整数转换为二进制…
- 计算一个整数二进制表示时有多少位是为1的算法
- 计算1个数--计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。
- 计算一个整数的二进制表示有多少个1(别人的最快算法)
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数