法1:
知识点:
1<<i: 是将1左移i位,第i位为1,其余为为0
N&(1<<i): N与左移后的i按位与
这样会有两个结果:
1.如果N的第i位为0,则其为0(全0)
2.保留N的第i位,其余位置为0
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
/*创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,输入的内容传给Scanner
next() 只读取到空格之前的数据
[读取完后把光标放在读取数据的同一行,该数据的后面]
nextInt()只能读取整数类型
[光标放在读取数据的同一行,该数据的后面]
nextLine()读取整行的数据包括单词间的空格,到回车结束(也就是从开始读一整行包括回车)
[光标放在下一行开头]*/
System.out.println(Integer.toString(N, 2));
//Integer.toString(int par1,int par2):par1表示 转成字符串的数字,par2表示 转成的进制表示
//Integer.toString(22,2):表示把22转成2进制表示的字符串,
int count =0;
//count来计数,比对每一位
for(int i=0;i<32;i++)
{
if((N&(1<<i))==(1<<i)) {
count++;
}
//都把1移动到相应的位与N作与运算 N&(1<<i)
//如果这一位是1,那么恰好 等于 1移位的数值(1<<i),则计数
}
System.out.println(count);
//单个位次地比较,检测到1就进行count的计数
法2:
将N和1进行按位与运算,可以得出最低位
结果为1,最低位为1;
结果为0,最低位为0,然后循环将N右移一位进行运算。
int count =0;
for(int i=0;i<32;i++)
{
if((N&1)!=0){count++;}
N=N>>>1; //“>>>”表示无符号右移
}
法3:
思想:开始消除1,消除1的个数就是1的个数
最后一个1会往回借,而后面的0会全变成1 :8(1000) 减一得7(0111)
原数 | 1 | 0 | 1 | 0 | 0 |
原数-1 | 1 | 0 | 0 | 1 | 1 |
原数&(原数-1) | 1 | 0 | 0 | 0 | 0 |
(x-1)&x 的效果就是 消去最低位的1
count =0;
while(N!=0)
{
N=((N-1)&N);
count++;
}
System.out.println(count);
完整代码:
法1:
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
System.out.println(Integer.toString(N, 2));
int count =0;
for(int i=0;i<32;i++)
{
if((N&(1<<i))==(1<<i)) {//计算时,N是以二进制来参与运算的
count++;
}
}
System.out.println(count);
}
}
法2:
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
System.out.println(Integer.toString(N, 2));
int count =0;
for(int i=0;i<32;i++)
{
if((N&1)!=0){count++;}
N=N>>>1; //“>>>”表示无符号右移
}
System.out.println(count);
}
}
法3:
import java.util.Scanner;
public class a {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
System.out.println(Integer.toString(N, 2));
int count =0;
while(N!=0)
{
N=((N-1)&N);
count++;
}
System.out.println(count);
}
}