本文共 2249 字,大约阅读时间需要 7 分钟。
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
class Solution { public int NumberOf1(int n) { int count = 0; //比较巧妙的方法,统计出现一个整数二进制数值(计算机中数值都是以补码的形式存在的,正数的补码为本身,负数的补码 // 需要额外求出来,先求反码,然后再加一。反码是符号位不变,然后其余位取反) while(n!= 0){ count++; //让n和n-1做按位与操作,假如有一个数二进制为1100,现在要统计这个二进制数中出现的1的个数,那么它减一之后为1011,此时做&运算可以把它 //最右边出现的1开始后面的所有位置零,下一次循环就继续找到下一个最右边的值,如此往复,那么就可以一个统计出 //整形二进制中1出现的个数。 n = n & (n - 1); } return count; }}
这里在补充一点关于求一个整数的二进制的一些方法
public static int NumberOf1(int n) { /* * 第一种方法,自己想的 * */ boolean flag = false; if (n < 0) { n=-n; } int index; ArrayList arrayList = new ArrayList(); StringBuilder sb = new StringBuilder(); while (n / 2.0 != 0) { index = n % 2; n = n / 2; arrayList.add(index); } System.out.println(arrayList); Collections.reverse(arrayList);//获得了二进制的表现初级形式. System.out.println(arrayList); int len = 32 - arrayList.size(); for (int i = 0, k = 0; i < 32; i++) { //获得32位二进制表示的字符串 if (i < len) { sb.append("0"); } else { sb.append(arrayList.get(k)); k++; } } String str = sb.toString(); System.out.println(str); if(flag){ //如果该整数,就还有进行求反码,以及根据反码求补码 sb.setCharAt(0,'1'); for(int i=1;i<=31;i++){ //除了符号位取反 if(sb.charAt(i)=='0'){ sb.setCharAt(i,'1'); } else{ sb.setCharAt(i,'0'); } } //加一操作 if(sb.charAt(sb.length()-1)=='0'){ //如果最后一位为零,那么直接加一即可,这里是直接设置为1 sb.setCharAt(sb.length()-1,'1'); } else { //如果最后一位不为0,那么就是1,加一之后,要让它变成零,进位 //找到倒数第一个为零的字符,然后让这个字符置为1,它后面的字符都为0 int zeroIndex = sb.lastIndexOf("0"); sb.setCharAt(zeroIndex,'1'); for(int ind=zeroIndex;ind=0;j--){ if(((1<
问题虽然是暂时得到了解决关于本题,引发了我的新的疑问,就是如果说要统计0出现的次数应该怎么写?(不用系统函数的情况)欢迎广大网友给点建议?
转载地址:http://frlen.baihongyu.com/