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 };
  • 相关阅读:
    EXTJS 基本使用
    EXTJS 常用控件的使用
    EXTJS 验证与表单提交
    EXTJS 常用方法
    禁用USB移动盘的方法
    常用sql 函数练习示例
    .Net 中的反射(反射特性) Part.3
    Delphi調用.NET的WebService
    c#写的串口通讯
    打印控制
  • 原文地址:https://www.cnblogs.com/Asumi/p/12398889.html
Copyright © 2011-2022 走看看