题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
 
 
题目链接:
 
 
package com.sunshine.OFFER66_SECOND;

import org.junit.Test;

public class A11_NumberOf1 {

    @Test
    public void test() {
//        int n = 127;
//        System.out.println(NumberOf1(n));
//        System.out.println(NumberOf12(n));

//        System.out.println((1<<31)-1);
        System.out.println(NumberOf1(214748367));
        System.out.println(NumberOf12(214748367));
        System.out.println(NumberOf13(214748367));
//        printBinary(214748367);
//
//        printBinary(m1);
//        printBinary(m2);
//        printBinary(m4);
//        printBinary(h01);
    }

    private void printBinary(int n) {
        int i = 0;
        while (n > 0) {
            System.out.print(n & 1);
            n >>= 1;
            if (++i % 8 == 0) {
                System.out.print(" ");
            }
        }
        System.out.println();
    }


    final int m1 = 0x55555555; //binary: 0101...
    final int m2 = 0x33333333; //binary: 00110011..
    final int m4 = 0x0f0f0f0f; //binary:  4 zeros,  4 ones ...
    final int h01 = 0x01010101;

    //未过答案。
    public int NumberOf1(int n) {
        int ans = 0;
        if (n >= 0) {
            while (n != 0) {
                ans += n & 1;
                n >>= 1;
            }
        } else {
            int m = -n;
            boolean flag = false;
            while (m != 0) {
                int re = m & 1;
                if (!flag) {
                    if (1 == re) {
                        flag = true;
                    } else {
                        ans++;
                    }
                } else if (flag && 1 == re) {
                    ans++;
                }
                m >>= 1;
            }
            ans = 32 - ans;
        }
        return ans;
    }

    //汉明重量
    public int NumberOf12(int n) {
        int n1 = (n & m1) + ((n >> 1) & m1);
        int n2 = (n1 & m2) + ((n1 >> 2) & m2);
        int n3 = (n2 & m4) + ((n2 >> 4) & m4);
        int ans = (n3 * h01) >> 24;
        return ans;
    }

    //其他人解
    public int NumberOf13(int n) {
        int ans = 0;
        while (n != 0) {
            ans++;
            n &= (n - 1);
        }
        return ans;
    }

}

 

posted on 2019-08-28 17:44  MoonBeautiful  阅读(214)  评论(0编辑  收藏  举报