zoukankan      html  css  js  c++  java
  • 11.二进制中1的个数

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
     
    思路1:
    先判断最后一位是不是1 ,然后右移一位,再判断是不是1 
    但是如果输入负数 就会进入死循环,因为负数多次右移之后会变成1111....111

    所以正确的思路是 我们左移1,每次移动1位。
     
     1 public class Solution {
     2     public int NumberOf1(int n) {
     3         int count = 0;
     4         int flag = 1;
     5         while(flag!=0){
     6             if((flag & n)!=0)
     7                 count ++;
     8             flag = flag<<1;
     9         }
    10         return count;
    11     }
    12 }

     思路2:

    结论:

    n-1与n按位与 , 会把n最右边一个变成 0.

    统计一下一共变了几次,就有几个1.

     1 public class Solution {
     2     public int NumberOf1(int n) {
     3         int count = 0;
     4         while(n!=0){
     5                count ++;
     6                n=((n-1)&n);
     7                }
     8         return count;
     9     }
    10 }
    c++:20180807
     1 class Solution {
     2 public:
     3      int  NumberOf1(int n) {
     4       int cnt=0;
     5       for(int flag=1;flag!=0;flag=flag<<1)
     6          if(flag&n)
     7              cnt++;
     8          
     9       return cnt;
    10      }
    11 };
  • 相关阅读:
    初步学习next.js-1-新建项目
    对象比较-深层,浅层
    制作右键菜单
    使用高德API-初级应用
    启动前后端连载方法
    使用websocket
    关于图片压缩
    归并排序(mergesort)
    冒泡排序
    递归介绍
  • 原文地址:https://www.cnblogs.com/zle1992/p/7801257.html
Copyright © 2011-2022 走看看