蓝桥学院2019算法题1.4

  共有三种解法:

    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 }

  

原文地址:https://www.cnblogs.com/zsh-blogs/p/10375034.html