在一行上输入一个整数
,表示待统计的数值。
在一行上输出一个整数,表示
的二进制表示中
的数量。
3
2
的二进制表示为
,其中包含两个
。
65
2
的二进制表示为
,其中包含两个
。
import java.util.Scanner;
/**
* @author YHX
* @date 2019/9/4 11:14
* description
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
int cnt = 0;
boolean flag = true;
while (n != 0) {
cnt++;
n=n&(n-1);
}
System.out.println(cnt);
in.close();
}
} 如果n不为0,那么n肯定有一个为1的二进制位,当n-1的时候 ,就是把n最右边的1变成0,然后这个1最右边的0变成1,例如10(1010)-1就是1001,最右边的1变成0,最右边的0变成1。当把它们进行与操作的时候1010&1001=1000,就相当于把剩下的1保留了下来,然后再进行上述重复操作直到n等于0就能统计出n的1的个数了。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
int t = 0;
if(n>0){
while(n>=2){
if(n%2==1){
t++;
}
n=n/2;
}
System.out.print(t+1);
}else if(n==0){
System.out.println(0);
}else{
n=-n;
String s = "";
//转二进制
while(n>=2){
s=s+String.valueOf(n%2);
n=n/2;
}
s=s+String.valueOf(n%2);
int len = s.length();
int []a = new int [len];
//取反
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1'){
a[i]=0;
}else{
a[i]=1;
}
}
//取补
a[0]=a[0]+1;
for(int i=0;i<len-1;i++){
if(a[i]==2){
a[i]=0;
a[i+1]=a[i+1]+1;
}
}
for(int i=0;i<len;i++){
if(a[i]==1){
t++;
}
}
System.out.println(t+64-len);
}
}
}
三种方法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long inputValue = sc.nextLong();
int mask = 1;
int count = 0;
for (int i = 0; i < 64; i++) {
if ((inputValue & mask) != 0) {
count++;
}
mask <<= 1;
}
System.out.println(count);
}
// 方法二:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long inputValue = sc.nextLong();
int res = 0;
// 注意 & 只能 Int 或者 long,double 不能用
while (inputValue != 0) {
inputValue = inputValue & (inputValue - 1);
res++;
}
System.out.println(res);
}
// 方法三:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long inputValue = sc.nextLong();
// 方法二:调用 API
int resNum = 0;
// 只有 long 有这个方法
String resString = Long.toBinaryString(inputValue);
for (int i = 0; i < resString.length(); i++) {
if (resString.charAt(i) == '1') {
resNum++;
}
}
System.out.println(resNum);
}
}
import java.util.Scanner;
public clas***ain{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
long a = sc.nextLong();
String str = Long.toBinaryString(a);
int count = 0;
for(char ch:str.toCharArray()){
if(ch=='1') count++;
}
System.out.println(count);
}
} long n;
cin >> n;
int cnt = 0;
while(n)
{
n = n & n - 1;
cnt++;
}
cout << cnt << endl; 方法二: long n;
cin >> n;
int cnt = 0;
long mask = 1;
while(mask)
{
if(n & mask) cnt++;
mask <<= 1;
}
cout << cnt << endl; 方法三: if(n < 0)
{
//需要注意,这里的0x01需要强制转为long,默认为int,导致结果不正确
n = n - ((long)0x01 << (sizeof(long) * 8 - 1));
cnt++;
}
while(n != 0)
{
if(n & 0x01) cnt++;
n = n >> 1;
}
cout << cnt << endl; 方法四: long shift = 0;
while(shift < (sizeof(long) * 8))
{
// 同样需要注意,0x01需要强制转为long类型,
if(n & ((long)0x01 << shift)) cnt++;
shift++;
}
cout << cnt << endl; import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long x = scanner.nextLong();
// 使用Long类的bitCount方法计算二进制中1的数量
int count = Long.bitCount(x);
System.out.println(count);
}
} #include<bits/stdc++.h>
using namespace std;
int main()
{
long n;
cin >> n;
int num = 0;
while (n) {
if (n & 1) num++; // 统计最后一位是否为 1
n >>= 1;
}
cout << num << endl;
return 0;
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
long num = sc.nextLong();
int count = 0;
while(num != 0){
count += num & 1;
num >>>= 1;
}
System.out.println(count);
}
}