一、题目
————————————————
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
————————————————
二、思路
————————————————
n&(n-1)
该位运算去除 n 的位级表示中最低的那一位。
n : 10110100 n-1 : 10110011 n&(n-1) : 10110000
时间复杂度:O(M),其中 M 表示 1 的个数。
————————————————
三、解决问题
————————————————
测试用例
1.正数(包括边界值1、0x7FFFFFFF)
2.负数(包括边界值0x80000000、0xFFFFFFFF)
3.0
————————————————
package swordoffer; /** * @author LQ * @version 1.0 * @date 2020-03-20 9:09 */ /** * 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 */ public class Solution14 { public static void main(String[] args) { Solution14 demo = new Solution14(); System.out.println("=============================="); demo.test1(); System.out.println("=============================="); demo.test2(); System.out.println("=============================="); demo.test3(); System.out.println("=============================="); demo.test4(); System.out.println("=============================="); demo.test5(); System.out.println("=============================="); demo.test6(); System.out.println("=============================="); } /** * n&(n-1) 该位运算去除 n 的位级表示中最低的那一位。 时间复杂度:O(M),其中 M 表示 1 的个数。 * @param n * @return */ public int NumberOf1(int n) { int count = 0; while(n != 0){ count++; n &= (n-1); } return count; } // =========测试代码========= void test(String testName, int n, int expected) { if (testName != null) System.out.println(testName + ":"); if (NumberOf1(n) == expected) { System.out.println(" soluton1:" + "passed "); } else { System.out.println(" solution1:" + "failed "); } } void test1() { test("Test for 0", 0, 0); } void test2() { test("Test for 1", 1, 1); } void test3() { test("Test for 10", 10, 2); } void test4() { test("Test for 0x7FFFFFFF", 0x7FFFFFFF, 31); } void test5() { test("Test for 0xFFFFFFFF", 0xFFFFFFFF, 32); } void test6() { test("Test for 0x80000000", 0x80000000, 1); } }
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。