• <剑指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));
        }
    }
  • 相关阅读:
    jquery实现记住用户名和密码
    从mysql8.0.15升级到8.0.16
    mysql8.0.15二进制安装
    DML、DDL、DCL的分别是什么
    redis3.2.10单实例安装测试
    redis5.0.3单实例简单安装记录
    percona-xtrabackup快速安装及其简单使用
    pt-show-grants的用法
    Centos6安装Percona-tools工具
    sshpass-Linux命令之非交互SSH密码验证
  • 原文地址:https://www.cnblogs.com/HarSong13/p/11325221.html
Copyright © 2020-2023  润新知