共有三种解法:
1、将1左移i位后与N进行&,只有都为1时,结果才为1。
2、n无符号右移与1&,结果为1说明当前位为1。
3、(x-1)&x 可以消掉最低位上的1.消掉几次,1的个数就为几。
补充知识:
<< ,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。9 << 1 = 18; 9二进制为1001,左移1位,10010,十进制为18。Java负数存储是以补码形式存储的(补码=反码+1),-9的二进制为11111111111111111111111111110111。
>>,有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。9 >> 1 = 4,-9 >> 1 = -5。
>>>,无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位)。9 >>> 1 = 4,-9 >>> 1 = 2147483643。
1 package bitOperation; 2 3 import java.util.Scanner; 4 5 /** 6 * @author zsh 7 * @company wlgzs 8 * @create 2019-02-14 14:52 9 * @Describe 题3:二进制中1的个数 10 * 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。 11 * 例9的二进制表示为1001,有2位是1。 12 */ 13 public class Main3 { 14 public static void main(String[] args) { 15 Scanner scanner = new Scanner(System.in); 16 int n = scanner.nextInt(); 17 //输出该数的二进制数 18 System.out.println(Integer.toBinaryString(n)); 19 //计数 20 int count = 0; 21 for (int i = 0; i < 32; i++) { 22 //将1左移i位后与N进行&,只有都为1时,结果才为1。 23 if ((n & (1 << i)) == (1 << i)){ 24 count++; 25 } 26 } 27 System.out.println(count); 28 System.out.println("----------方法二------------"); 29 count = 0; 30 for (int i = 0; i < 32; i++) { 31 //n无符号右移与1&,结果为1说明当前位为1 32 if (((n >>> i) & 1) == 1){ 33 count++; 34 } 35 } 36 System.out.println(count); 37 System.out.println("----------方法三------------"); 38 count=0; 39 while (n != 0){ 40 //(x-1)&x 可以消掉最低位上的1.消掉几次,1的个数就为几。 41 n = (n-1) & n; 42 count++; 43 } 44 System.out.println(count); 45 } 46 }