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));
        }
    }
  • 相关阅读:
    2017.3.11[bzoj2440][中山市选2011]完全平方数
    2017.3.6[hihocoder#1415]后缀数组三·重复旋律3
    2017.3.4[hihocoder#1407]后缀数组二·重复旋律2
    [NOI2013]快餐店
    [HNOI2014]米特运输
    [HNOI2015]亚瑟王
    [JLOI2013]卡牌游戏
    [SDOI2010]地精部落
    [ZJOI2007]棋盘制作
    [AHOI2009]中国象棋
  • 原文地址:https://www.cnblogs.com/HarSong13/p/11325221.html
Copyright © 2011-2022 走看看