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

    题目描述

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
     
    public class Solution {
        public int NumberOf1(int n) {
            int count = 0;
            while(n!= 0){
                count++;
                n = n & (n - 1);
             }
            return count;
        }
    }

    1.这个题第一个想到的是 让n和1做与操作,判断结果是不是0,因为1的二进制为00000001,如果结果不为0,那么当前n的最后一位是1,这个时候将n右移,重复如上操作。

    2.第一种思路有一个很大的问题就是,当n为负数是,右移高位补充1,会陷入死循环,第二种思路是,n不移动,1移动,1每次都左移动一位,那么1会依次变成00000001,00000010,,0000100,00001000.。。。。。。,这样移位之后的1依次和n做与运算,判断结果是不是0,就可以检查n从后往前的二进制位是不是1了。

    3.第三种思路和第二种相似,但是更为巧妙。只要n不等于0,就让n和n-1做与运算,并且让下一个循环的n变成上一次的n与n-1的结果。 原理是,n-1操作,会使n的最后一个1变成0,让最后一个1后面的0都变成1,这个时候在于n做与运算,就相当与把n的最后一个1变成0,每次变一个,并且检查n是否等于0了,即可,执行的次数就是1的个数

  • 相关阅读:
    yield* 表达式
    Set 对象和WeakSet对象
    洗牌算法
    filter() 方法创建一个新数组
    UTF8文件带BOM引起的问题
    ios的白屏坑
    css的字体样式怎么写
    npm全局安装失效修复
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)解决方案
    linux下nginx的安装及配置
  • 原文地址:https://www.cnblogs.com/tobemaster/p/5874846.html
Copyright © 2011-2022 走看看