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


    二进制中1的个数

    一、问题描述

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

    二、代码与解释

    class Solution {
    public:
         int  NumberOf1(int n) {
            int count = 0;
            while(n!= 0){
                count++;
                n = n & (n - 1);
             }
            return count;
         }
    };
    

    这是最最简单的一种方法。
    如果一个整数为0,那么直接返回0即可。若整数不为0,那么至少有一位为1。
    当前有一种操作,可以把这个整数中的1逐一消去,直到没有1为止。这个操作就是:将这个整数减1,再与原来的整数进行与操作,得到的就是将最后一位1消去变为0的过程。
    这个操作的原理是:减1操作,会把从右到左数起的第一个1变为0,在这个1的右侧的0(如果有)全部变为1,前面的值保持不变,变的只是这个1以及后面的0。与原来的整数进行与运算,改变了的位全部0。比如100,100减1为011,011&100=000,将从右到左数起的第一个1变成了0,到此为止,操作结束。有多少个1就有多少次这样的操作,直到最后的数变为0停止。

    keep going
  • 相关阅读:
    hdu 4685(强连通分量+二分图的完美匹配)
    图的连通性问题
    poj 1904(强连通分量+完美匹配)
    poj 2186 "Popular Cows"(强连通分量入门题)
    poj 1236(强连通分量分解模板题)
    EOJ2018.10 月赛
    21.Merge Two Sorted Lists
    20.Valid Parentheses
    19.Remove Nth Node From End of List
    18.4Sum
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10399414.html
Copyright © 2020-2023  润新知