给定一个一个字节(8位)的无符号整型数,求它的二进制数表示中1的个数。
分析:一个比较容易想到的方法是从低位到高位判断是否为1,每得到一位就把这个数右移,这样只需取最低位即可。时间复杂度是O(logv),其中logv是这个数的位数。如果还想进一步降低时间复杂度,我们可以只关注那些数位上为1的位。对于一个二进制数(比如11010000),我们可以这样找到它里面的1:把这个数减一(11010000 - 1 = 11001111),这样做是为了将最低位的一个1找到后并把这个1变为0(将这俩数按位与即可),同时我们计数器记下这个找到的最低位的1。以此类推直到这个数变为0,这样我们既找到了所有的1,又使得时间复杂度降为O(1的个数)。
int NumsOfOne(Byte v){
int count = 0;
while(v){
v &= (v - 1);
count++;
}
return count;
}
本文介绍了一种高效算法来计算一个无符号字节(8位)中二进制表示1的个数。通过将数值减1并进行按位与运算,可以有效地将每个1置0并计数,直至数值变为0。这种方法的时间复杂度为O(1的个数),相较于遍历每一位的简单方法更加高效。

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



