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

    问题

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

    思路

      方法一:就是让原始数据与1进行与运算,若为1,则表示最低位为1,则count++,原始数据向右移动1位。大概过程{1,0,0,1}&{1} --》 1 , {0,1,0,0}&{1}--》0, {0,0,1,0}&{1}--》0, {0,0,0,1}&{1}--》1,所以最后的结果为2。

      方法二:方法二是对方法一的升级版,此方法并没有对number进行位运算,所以不存在方法一中的问题而且这个方法是有多少个1,进行多少次,而方法1是原始数据有多少位进行多少次。大概过程{1,0,0,1}&{1,0,0,0}--》{1,0,0,0},{1,0,0,0}&{0,1,1,1}--》{0,0,0,0}所以结果为2.

    package offer010;
    
    import java.util.Scanner;
    
    /** 
     * @Title: Main.java
     * @Package: offer010
     * @Description 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
     * @author Han
     * @date 2016-4-19 下午2:02:24 
     * @version V1.0
     */ 
          
    public class Main {
        
        public static void main(String[] args) {
            
            Scanner scanner = new Scanner(System.in);
            long number = 0;
            int countOf1 = 0;
            
            while(scanner.hasNext()){
                
                number = scanner.nextLong();
                countOf1 = numberOf1Mehtod1(number);
    //            countOf1 = numberOf1Mehtod2(number);
                
                System.out.println(countOf1);
            }
        }
    
        
        private static int numberOf1Mehtod1(long number) {
            
            int flag = 1;
            int count = 0;
            
            while(number > 0){
                
                if((number & flag) == 1){
                    
                    count++;
                }
                
                /**
                 * 位运算 ==> number = number / 2,但是在效率上,位运算比除运算快很多,所以争取以后都用位运算替代除运算
                 * 对原始数据number进行了位运算,可以会出现问题,比如0x80000000的第一位表示的是负数时,做除法位运算,得到的结果应该是0xC0000000
                 * 最后会得到0xFFFFFFFF的死循环,所以最好不要对原始数据number进行位运算
                 */
                number = number >> 1;
            }
            
            return count;
        }
        
        private static int numberOf1Mehtod2(long number) {
            
            int count = 0;
            
            while(number > 0){
                
                /**
                 * 此方法并没有对number进行位运算,所以不存在方法一中的问题
                 * 而且这个方法是有多少个1,进行多少次,而方法1是原始数据有多少位进行多少次 
                 */
                number = (number - 1) & number;
                count++;
            }
            
            return count;
        }
        
    }
  • 相关阅读:
    ORB-SLAM(五)优化
    ORB-SLAM(四)追踪
    ORB-SLAM(三)地图初始化
    SVM(支持向量机)的一点理解
    ORB-SLAM(二)性能
    ORB-SLAM(一)简介
    支持高并发的IIS Web服务器常用设置
    微信JS SDK Demo
    C#开发微信门户及应用-使用地理位置扩展相关应用
    DropdownListFor无法正确绑定值-同名问题
  • 原文地址:https://www.cnblogs.com/a294098789/p/5408012.html
Copyright © 2011-2022 走看看