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

    题目链接:二进制中1的个数

     

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

     

    题解:

    1、很容易想到每次做&运算,然后判断结果是否为0来判断是否有1。

    2、去讨论区看了下第一个方法效率太低。

    第二个方法就是让每次让n & n-1。我刚开始没懂举了个例子。

    n = 1100

    1100 - 1 = 1011  1100&1011 = 1000

    1000 - 1 = 0111  1000 & 0111 = 0000 

    从上可得,每次-1操作是使'1'位被借走,再和原来的&会使被借位的1变成0。

    也就是我们每次做这个操作的时候都会使数字里的1变成0,那么只要全为0,这个1的个数就找出来了。

     

    代码:

     1 class Solution {
     2 public:
     3      int  NumberOf1(int n) {
     4         int cnt = 0;
     5         int flag = 1;
     6         while(flag >= 1 || flag <= -1){
     7             if(( n & flag) != 0){
     8                 cnt++;
     9             }
    10             flag <<= 1;
    11         }
    12         return cnt;
    13      }
    14 };
    15 
    16 
    17 
    18 class Solution {
    19 public:
    20      int  NumberOf1(int n) {
    21          int cnt = 0;
    22          while(n){
    23              n = n&(n-1);
    24              cnt++;
    25          }
    26         return cnt;
    27      }
    28 };
  • 相关阅读:
    php验证码
    php上传
    ajax的用法 资料
    ajax如何使用
    AJAX
    基础概念梳理 :
    ICompare 可比较接口
    强类型 和弱类型 c#
    .ne 基础(2)
    .net 基础(一)
  • 原文地址:https://www.cnblogs.com/Asumi/p/12398889.html
Copyright © 2011-2022 走看看