目录
输入的数字按位与1,可以求得最末尾的数字是0还是1。求得末位后右移1位,去掉末位再继续与1。
n& (n-1):n-1二进制序列中的1的个数比n中少了1个。
例题:求一个整数,在内存当中存储时,二进制1的个数。
二进制序列中,一共有32位,包括符号位。
下图展示7的32位比特位。
方法1思路:
输入的数字按位与1,可以求得最末尾的数字是0还是1。求得末位后右移1位,去掉末位再继续与1。
按位与:同1则1,有0则0。
32个比特位,一共需要挪动32次进行判定。
import java.util.Scanner;
public class Test {
//求一个二进制数中的1的个数法1:
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(((num >> i) & 1) != 0){
count++;
}
}
System.out.println(count);
}
}
方法二思路:
判定与1之后的结果是否等于0,等于0则跳出循环。
这里需要着重注意的是在num右移的过程中使用的是无符号右移。
无符号右移最高位补0,有符号右移最高位补齐的是符号位
-1>>1 = -1 会出现死循环!!!!
import java.util.Scanner;
public class Test {
//求一个二进制数中的1的个数法2:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int count = 0;
while(num != 0){
if((num & 1) != 0){
count++;
}
num >>>= 1; //无符号右移
}
System.out.println(count);
}
}
方法三思路:
n& (n-1):n-1二进制序列中的1的个数比n中少了1个。
import java.util.Scanner;
public class Test {
//求一个二进制数中的1的个数法3:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int count = 0;
while(num != 0){
count ++;
num = num & (num - 1);
}
System.out.println(count);
}
}