zoukankan      html  css  js  c++  java
  • 剑指offer(8)

    题目:

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

    思路:

      第一反应想到的是把数右移,每一位与1相与,然后判断个数,但是若输入的为负数,会出现死循环现象。

      所以我们设置一个标志量1,首先把输入数与1相与,判断,接着,左移标志量,继续接着判断,直到标志位超出系统位数,全变成0为止,这样就可以避免输入负数,出现死循环的现象。

    public class Solution {
        public int NumberOf1(int n) {
            int flag = 1;
            int count = 0;
            while(flag!=0){
                if((n&flag)!=0){
                    count++;
                }
                flag=flag<<1;
            }
            return count;
        }
    }
    

      但是这个解法中,如果系统是32位,需要判断32次,接下来的算法中,整数中有几个1就只需循环几次。

      输入数如果不是0,那么至少有一位是0,当我们把这个数减一,若最右边的1在m位,且最后一位是0,那么m-1位至最后位全变成1,m位变为0,例如101000,前文m位即为倒数第四位,当减一时,m位变成0,而m位之后全变成1,此时让这个输入数-1与之前的输入数做与运算,会发现我们是在做“去1”运算,当输入数中有k个1,那么我们完成k次的"去1"运算后,输入数将会变成0。

    public class Solution {
        public int NumberOf1(int n) {
    
             int count = 0;
            while(n!= 0){
                count++;
                n = n & (n - 1);
             }
            return count;
        }
    }
    

      

  • 相关阅读:
    Ubuntu 12.04 下 Sublime Text 3 Build 3047 破解
    如何让Ubuntu 12.04 LTS更炫更具吸引力
    重装Ubuntu时如何保留/home分区中的数据
    【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
    TCP协议三次握手过程分析
    狮子的预言
    来跟从我
    服役的灵
    追求良善
    安慰人心的主
  • 原文地址:https://www.cnblogs.com/figsprite/p/10461824.html
Copyright © 2011-2022 走看看