zoukankan      html  css  js  c++  java
  • 23:一个整数的二进制表示中有多少个1

    题目:

    一个整数存储在内存中,输出它的二进制表示中1的个数

    思路:

    要判断这个整数的二进制表示中1的个数,联想到这是[位运算]的题目。

    最先想到巧妙利用[1]这个数,[1]只有最右一位是1,其他位均为0;

    所以,接下来应该想到,用“1”和这个整数做[与运算],首先可以判断最右边一位是不是1,以此类推,该整数每右移一位,和1做与运算,直到该整数变为0.至此,问题思路已有,但是考虑非正常数字,比如[负数],该方法就不适用,因为负数二进制需要保持最高位一直为1,最后会陷入死循环(OXffffffff)前面的思路中,两个数与运算,那能否让[1]进行左移位,而原整数不动,这样可以判断次高位是否为1.以此[1]继续左移.

    还有一种思路,一个不为0的整数i,至少有一位为1,做这样的操作:

    i-1 得到的结果是  整数i的最右边一位1的右边所有原来为0的位都变为1,1这一位变为0,即减1后最右边1之后的所有位都取反了;然后把它和i做与运算,结果是将最右边一位1之后的所有位都变为0了,所以,反复这样的步骤,做多少次减1的操作,i的二进制表示就有多少个1,直到多次减1后i变为0. 

    另:清除最右边一位为0 的方法:

    i=i&(i-1)

    package prctice01;
    /*题目:
    一个整数存储在内存中,输出它的二进制表示中1的个数*/
    import java.util.Scanner;
    public class numberof1 {
    public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            while(in.hasNext())
            {
                int input = in.nextInt();
                int count = 0;
                while(input!= 0)
                {
                    input=input&(input-1);
                    count++;
                }
                System.out.println(count);
        }
        }
    //i=i&(i-1)
    }
  • 相关阅读:
    组合模式
    数据去重
    combiner
    合并文档
    对象锁 区别 类锁
    一个简单的死锁示例
    线程安全的单例模式
    线程安全与不安全(误解)
    tf.nn.max_pool 池化
    tf.nn.depthwise_conv2d 卷积
  • 原文地址:https://www.cnblogs.com/newcoder/p/5698030.html
Copyright © 2011-2022 走看看