牛客网剑指Offer小题练习:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
直接上代码 解析在代码边注释了 Lz比较lazy 所以就直接上代码了 嘿嘿!
package 小作业;
import java.util.Scanner;
//输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
/**
* 主要思想就是从整数二进制的最右一位开始判断是否为1
*
* @author qjy
*
*/
public class ErJinZhi {
/**
* key1 最优解 时间复杂度为几个1就执行几次
*
* @param n
* @return
*/
static int f(int n) {
int count = 0;// 计数
if (n == 0)// 如果n的二進制的每一位都是0,直接返回count计数次数
return count;
else {
while (n != 0) {// 当n的最右一位不是0时候进入循环
++count;// 首先次数+1
n = (n - 1) & n;// 之后将n的二进制和(n-1)的二进制进行与运算,将得出来的值给n再次比较
// 例 二进制1100 减一后为1011 与运算后是 1000 赋给n 再次进入循环判断最右位是否为1
}
}
return count;// 返回计数次数
}
/**
* key2 更能体现出位运算特点
*
* @param args
*/
static int f1(int n) {
int count = 0;
int flag = 1;
while (flag != 0) {
if ((n & flag) != 0) {// 用1和n的每一位进行与运算 来判断1的个数
count++;
}
flag = flag << 1;// 1自身左移运算,其实后来就不是1了
}
return count;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int s = scan.nextInt();
System.out.println("该数二进制表示中1的个数有" + f(s) + "个");
System.out.println("该数二进制表示中1的个数有" + f1(s) + "个");
}
}
好了,这个博客就到此完了,如果有疑问或者其他不懂的地方可以私聊Lz哦 我会很热心帮大家解答,我们共同进步!