zoukankan      html  css  js  c++  java
  • 剑指offer——16二进制中1的个数

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
      
    有可能引起死循环解法:
      每次判断最右端是不是1【与 & 1即可】,是就cnt++,然后右移一位,直到num为0,结束;
      但是这只对正数有用,而负数右移是左端补充1,这样导致num最终成为 0xFFFFFFFF,从而右移成了死循环。
      
     1 class Solution01 {
     2 public:
     3     int  NumberOf1(int n) {
     4         int cnt = 0;
     5         while (n)
     6         {
     7             if (n & 1)cnt++;
     8             n = n >> 1;
     9         }
    10         return cnt;
    11     }
    12 };
    常规做法:
      这次,不移num,直接将1左移,然后每移动一次就与 & num,>0,则此位为1;
      
     1 class Solution02 {
     2 public:
     3     int  NumberOf1(int n) {
     4         int cnt = 0;
     5         unsigned num = 1;//一定是无符号的!!!
     6         while (num)
     7         {
     8             if (n & num)cnt++;
     9             num = num << 1;//num<<1不能改变num的
    10         }
    11         return cnt;
    12     }
    13 };

     

    新颖的做法:
      把一个整数减去1,再和原整数做与运算第会把该整数最右边的1变成0.
      那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
      
     1 class Solution03 {
     2 public:
     3     int  NumberOf1(int n) {
     4         int cnt = 0;
     5         while (n)
     6         {
     7             ++cnt;
     8             n = (n - 1)&n;
     9         }
    10         return cnt;
    11     }
    12 };
      
     
  • 相关阅读:
    Java并发/多线程-线程池的使用
    pam详解
    chrony时间同步服务
    网站每日UV数据指标去重统计
    阻塞式发送邮件
    待办事项-redis
    解决Windows7、Windows10 ping不通的问题
    redis序列化和反序列化的操作-(以前咋操作我都忘记了)
    秒杀活动下的公平队列抢购机制
    控制某个字段不在页面展示
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11656614.html
Copyright © 2011-2022 走看看