zoukankan      html  css  js  c++  java
  • <剑指offer> 第8题

    题目:

    实现一个函数:输入一个整数,输出该二进制表示中1的个数。例如9表示成二进制1001,有2位1。输入9,输出2

    (>>>表示不带符号向右移动二进制数,移动后前面统统补0;两个箭头表示带符号移动)

    思路:

    1.位移+计数,每次右移一位,不断和1进行与运算,直到位0

    (JAVA语言规范中,int整型占四个字节,总计32位)

    2.循环让(n - 1)& n

    如果n的二进制中有k个1,那么这个方法只需要循环k次即可。原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。

    因为从二进制的角度讲,n相当于在n-1的最低位加上1。

    8(1000) = 7(0111)+ 1(0001)

    8(1000)& 7(0111)= 0 (0000)清除了8最右边的1,8的二进制中只有一个1

    7(01111)= 6(0110)+ 1(0001)

    7(0111)& 6(0110)= 6(0110)清除了7最右边的1

    循环k次至n=0

    代码实现:

    public class Eighth {
        public static int countNumberOfOne1(int n){
            int result = 0;
            for(int i = 0; i < 32; i ++){
                result += (n & 1);
                n >>>= 1;
            }
            return result;
        }
    
        public static int countNumberOfOne2(int n){
            int result = 0;
            while(n != 0){
                result ++;
                n = (n - 1) & n;
            }
            return result;
        }
    
        public static void main(String[] args){
            int i = 9;
            System.out.println(countNumberOfOne1(i));
            System.out.println(countNumberOfOne2(i));
        }
    }
  • 相关阅读:
    多属性量化决策模型
    对称加密与非对称加密
    子网掩码
    网络安全
    万维网WWW、电子邮件email与文件传输FTP
    DHCP协议
    DNS协议
    ARP协议与RARP协议
    springboot WebSocket的使用
    Java调用Python的两种方式
  • 原文地址:https://www.cnblogs.com/HarSong13/p/11325221.html
Copyright © 2011-2022 走看看