• 剑指offer:二进制中1的个数


    题目描述:

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

    解题思路:

    这道题考察的是位运算的内容。对这一部分不是很熟悉。查看了网上的思路。

    思路一:

    每次都将n与1做与运算,再不断右移n,这样每次都考察最右边那位数是否为1.但这样存在的问题是,对于负数来说,符号位总为1,在右移过程中左边总是补1,因此掉入无限循环。

    思路二:

    因此考虑右移1,将无符号的flag初始设为1,每次都将其左移一位,左移的过程中,右边补0,因此只有指定位为1,判断(n&flag)的值,从而判断n中1的个数。注意的是flag必须为unsigned int类型。

    思路三:

    把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

    代码:

    思路二:

    class Solution {
    public:
         int  NumberOf1(int n) {
             int count=0;
             uint flag=1;
             while(flag>=1)
             {
                 if((n&flag)>0)
                     count++;
                 flag = flag<<1;
             }
             return count;
         }
    };

    思路三:

    public static int NumberOf1Solution3(int n)
        {
            int count = 0;
    
            while (n > 0)
            {
                count++;
                n = (n - 1) & n;
            }
    
            return count;
        }
  • 相关阅读:
    数组元素的查找1
    排序——选择排序
    排序——冒泡排序
    内部类——匿名内部类
    跳一跳
    数组元素换位置游戏
    六 java和Tomcat
    九 Jenkins持续集成
    八 ip和子网详解
    七 Git版本控制
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10591013.html
Copyright © 2020-2023  润新知