第一题:一个二进制数中1的个数
1.基础解法,我想我们都会对的循环&1右移
思路:与1按位或 然后右移循环,32次;
看代码:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();//输入一个数 int count = 0;//用来存放1的数目 for(int i=0;i<32;i++){ if((a&1)==1){ count++; } a>>=1;//每次a右移一下判断另一个位 } System.out.println(a+"的二进制位中1的个数是:"+count); }
2.思路进阶:通常小的数高位都是,循环32次没有必要,我们可以按照这个思路增加代码效率
看代码:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();//输入一个数 int count = 0;//用来存放1的数目 for(int i=0;i<32;i++){ if((a&1)==1){ count++; } a>>=1;//每次a右移一下判断另一个位 if(a==0){//a==0的适合就没有二进制位为1的数直接break就行 break; } } System.out.println(a+"的二进制位中1的个数是:"+count); }
3.最优解
思路:我们拿7举例子,我们只需要每次跟自己小1的数进行按位与,这样每次会与掉一个1 我们只需要求出等于0的适合按位与了多少次,这样再进阶思路的基础上又简化了代码
看代码:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();//输入一个数 int count = 0;//用来存放1的数目 while(a!=0){ a = a & (a-1); count++; } System.out.println(count); }
此方法的一个百度面试题:
判断一个正整数是不是2的k次方?你的第一思路是什么?就让他除以2吗?笨方法你肯定能做出来,但你肯定也没有回答到面试官的心里!!!!
思路:2的k次方有那些数??1 2 4 8 16 32 64.......有没有发现什么?他们的二进制位都只有一个1,那我们就可以通过上面的方法破解了!让面试官拍案叫绝!
上代码:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();//输入一个数 if(0==( a&(a-1) ) ){//如果他不是2的k次方,那么他&之后一定不是0 //只有二进制位只有一个1的数的&一次就会变成0 System.out.println("这个数是2的k次方"); } }
第二题:求出一个数的每一位是几
1.普通人
public static void main(String[] args) { n=1234; int a = 1234/1000;//求出1 int b = (n-a*1000)/100;//求出2 int c = (n-a*1000-a*100)/10;//求出3 int d = a%10;//求出4 }
2.进阶,你有没有想过 你不知道这是几位数的时候怎么办??
思路: 第一步,求出这是一个几位数,用除10的方法
第二步,求出每一位是几?求余10
将两步结合!!!看代码:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();//假设a=1234 int tmp=a;//找一个替罪羊,防止a的值被修改 while(tmp!=0){//tmp==0代表每一位都已经输出了 System.out.println(tmp%10+" ");//求出4 tmp/=10;//将4去掉,tmp变成了123 } }