题目:
输入一个非负数n,请计算0到n之间每个数字的二进制形式中1的个数,并输出一个数组。例如,输入的n为4,由于0、1、2、3、4的二进制形式中1的个数分别为0、1、1、2、1,因此输出数组[0,1,1,2,1]。
解法:
计算整数i的二进制形式中1的个数有多种不同的方法,其中一种比较高效的方法是每次用“i&(i-1)”将整数i的最右边的1变成0。整数i减去1,那么它最右边的1变成0。如果它的右边还有0,则右边所有的0都变成1,而其左边所有位都保持不变。下面对i和i-1进行位与运算,相当于将其最右边的1变成0。以二进制的1100为例,它减去1的结果是1011。1100和1011的位与运算的结果正好是1000。二进制的1100最右边的1变为0,结果刚好就是1000。
代码:
package 剑指offer;
public class t3前n个数字二进制的1的个数forlearn {
public static int[] countBits(int n){
//生成计算的数组
int[] results =new int[n+1];
//for
for(int i=0;i<=n;++i){
int j=i;
//只要是J不等于0就继续
while(j!=0){
results[i]++;
j=j&(j-1);
}
}
return results;
}
public static void main(String[] args){
int n=4;
int[] nums=countBits(n);
for(int i=0;i<=n;i++){
System.out.println(nums[i]);
}
}
}