zoukankan      html  css  js  c++  java
  • 二进制中1的个数

    前言

    本来是打算次条每天更新面试题和算法刷题的,加上头条一共要三篇文章,实在更不来,而且两篇都看的人也不多,所以我就算法刷题和面试题论着更新,更新的时候多更新几道。

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    解答

    方法1

    让 n 和 000....001,相与判断第一位是不是 1 ,然后和 00....010相与判断第二位是不是 1,以此类推。代码如下:

        public int NumberOf1(int n) {
            int count = 0;
            int k = 1;
            while (k != 0) {
                if ((n & k) != 0) {
                    count++;
                }
                k = k << 1;
            }
            return count;
        }
    

    方法2

    这个方法就比较牛逼了,可以说是最优解,直接看代码,如果不懂的可以自己找几个数字演示下,就能够理解了。

        public int NumberOf12(int n) {
            int count = 0;
            int k = 1;
            while (n != 0) {
                count++;
                n = (n - 1) & n;
            }
            return count;
        }
    

    其实有很多题是可以利用位的异或来解决的,大家可以思考下平时遇到哪些题是用这种方法解决的,我后面会给出几道题,这些题都可以用异或位运算巧妙解决。发的另一道题也用到了位运算。

    其实我是想跟大家说,做题的时候,有时候想想是否可以用位运算来解决。

  • 相关阅读:
    linux sort,uniq,cut,wc命令详解
    Linux IO实时监控iostat命令详解
    uniq命令
    四层和七层负载均衡的区别
    keepalived 和 heartbeat对比
    LVS+Keepalived实现负载均衡
    Lvs+heartbeat高可用高性能web站点的搭建
    使用 awk 过滤文本或文件中的字符串
    最全mysql的复制和读写分离
    伤不起
  • 原文地址:https://www.cnblogs.com/kubidemanong/p/10539386.html
Copyright © 2011-2022 走看看