法1:(可能会引起死循环)
- 由于int型占4字节,所以for循环进行32趟
- num右移和1相与
import java.util.Scanner;
public class pra1214 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个整数:");
int num=sc.nextInt();
int count=0;
for(int i=0;i<32;i++){
if((1&(num>>i))==1){
count++;
}
}
System.out.println("num在内存中存储时二进制1的个数为:"+count);
}
}
注意:在if语句中,不能写成num&(1<<i),这样结果可能是1000等数字,是不正确的。
法2(常规解法):
上面的代码中,如果是一个负数,对负数右移之后仍要保证是一个负数,所以会将最高位继续设为1,如果一直做右移,最终可能陷入死循环,
我们可以将1左移,改进后如下:
public class Solution {
public int NumberOf1(int n) {
int count=0;
for(int i=0;i<32;i++){
if(((1<<i)& n)==(1<<i)){
count++;
}
return count;
}
}
法3:
把一个整数减去 1,再和原整数做与运算,会把该整数最右边的1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作.
public class Solution {
public int NumberOf1(int n) {
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}
}