我是靠谱客的博主 俊秀小海豚,最近开发中收集的这篇文章主要介绍几种求32位数中1的个数的算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

方法一:最简单的循环位运算

int count1(int i)
{
int num=0;
while(i!=0)
{
num += i & 0x01;
i >>>= 1;
}
return num;
}

时间复杂度是O(n),且n一定是32。

方法二:n&(n-1)

int count2(int i)
{
int num = 0;
while(i!=0) {
i &= (i-1);
num++;
}
return num;
}

时间复杂度也是O(n),但只有在最坏情况下n才为32

方法三:查表发

查表发利用空间换取时间,利用一个32位的数组存储0~2^32的数每个数字的1的位数,利用arr[n]即可得到结果,时间复杂度为O(1),但是空间复杂度为O(2^n)。一般情况下不会使用一个大表直接查询,而是将32位拆分成4个8位数字,分别进行4次查表操作,然后将结果相加。

int count3(int n)
{
int[] bitCount = new int[256]{0,1,1,2,1,2,...};
return bitCount[n>>>24] +
bitCount[(n&0x00ff0000) >> 16] +
bitCount[(n&0x0000ff00) >> 8]
+
bitCount[(n&0x000000ff)];
}

时间复杂度为O(1),但空间占用比较大,且数组的寻址开销也很大。只有在特定环境中才建议使用。

最后

以上就是俊秀小海豚为你收集整理的几种求32位数中1的个数的算法的全部内容,希望文章能够帮你解决几种求32位数中1的个数的算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部