剑指 Offer 15 – 二进制中1 的个数
题目:
请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
提示:
输入必须是长度为 32 的 二进制串 。
分析:
- n & 1 = 0 则 n 二进制最右边一位为 0;
- n & 1 = 1 则 n 二进制最右边一位为1;
代码:
package com.xujinshan.offer.offer15;
/**
* @Author: [email protected]
* 剑指 Offer 15 -- 二进制中1 的个数
* 剑指 Offer 15. 二进制中1的个数
* <p>
* 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。
* 例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
* <p>
* 示例 1:
* <p>
* 输入:00000000000000000000000000001011
* 输出:3
* 解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。
* <p>
* 示例 2:
* <p>
* 输入:00000000000000000000000010000000
* 输出:1
* 解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。
* <p>
* 示例 3:
* <p>
* 输入:11111111111111111111111111111101
* 输出:31
* 解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
* <p>
* 提示:
* <p>
* 输入必须是长度为 32 的 二进制串 。
*/
/**
* 分析:
* n & 1 = 0 则 n 二进制最右边一位为 0;
* n & 1 = 1 则 n 二进制最右边一位为1;
* 根据以上特点,考虑以下循环判断:
* 1.判断n最后一位是否是1,根据结果计数
* 2.将n 右移动一位(本题要求把数字 n 看作无符号数,因此使用无符号右移操)
*/
class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int result = 0;
while (n != 0) {
if ((n & 1) == 1) {
result++;
}
// >>:带符号右移。正数右移高位补0,负数右移高位补1
// >>>:无符号右移。无论是正数还是负数,高位通通补0
n = n >>> 1;
}
return result;
}
}
public class Offer15 {
public static void main(String[] args) {
System.out.println(new Solution().hammingWeight(00000000000000000000000010000000));
}
}
结果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLyEjM1QTO1ATM1IzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)