• 剑指Offer10-二进制中1的个数


    题目:

    /**
         * 请实现一个函数,输入一个整数,
         * 输出该二进制表示中1的个数。
         * 例如把9表示成二进制是1001, 有2位是1。
         * 因此如果输入9,该函数输出2。
         */

    解题思路:常规的解法可以去遍历整数对应二进制的每一位,比如:数字9的二进制1001,依次将每一位的数字与1进行 与 运算,若结果为1则表明对应的位数为1;

    然后去累积计算1的总体个数。

    代码如下:

    public class No10 {
        public static void main(String[] args) {
            System.out.println(getNum(9));
            
        }
        
        public static int getNum(int num) {
            int count = 0;        //累加器:保存二进制中的个数
            int flag = 1;        //变量,每次循环左移一位
            
            while(flag!=0) {
                //与运算不等于0说明出现了当前二进制位为1的情况
                if((num & flag) != 0)
                    count++;
                flag = flag << 1;
            }
            return count;
        }
    }

    但是因为int在内存中站32位,故这种方法为循环32次;

    有没有一种方法是二进制中有多少个1就循环几次;

    答案是有的:首先要知道一个知识点:把一个整数减去1,然后把减去一的结果与该整数做运算,就会把最右边的1变成0,由此可以统计二进制中1的个数

    代码如下:

    public class No10 {
        public static void main(String[] args) {
            System.out.println(getNum(9));
            
        }
        
        public static int getNum(int num) {
            int count = 0;
            while(num != 0) {
                num = (num-1) & num;
                count++;
            }
            return count;
        }
    }
  • 相关阅读:
    HTTP 无法注册 URL http://+:xxxxx/ServicesName/。进程不具有此命名空间的访问权限
    C语言中宏的一些特别用法
    static和const的比较和解释
    堆和栈的区别
    c++中const用法
    链表常见笔试题
    自绘实现半透明水晶按钮 .
    C++面试题
    C/C++面试题大汇总
    C++ 值传递、指针传递、引用传递详解
  • 原文地址:https://www.cnblogs.com/meteorst/p/9234437.html
Copyright © 2020-2023  润新知