输入一个long类型的数值, 求该数值的二进制表示中的1的个数 .
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;
#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); } }