# 191. 位 1 的个数

## Link

{% embed url="<https://leetcode.cn/problems/number-of-1-bits>" %}

## Problem

编写一个函数，输入是一个无符号整数（以二进制串的形式），返回其二进制表达式中数字位数为 '1' 的个数（也被称为[汉明重量](https://baike.baidu.com/item/%E6%B1%89%E6%98%8E%E9%87%8D%E9%87%8F)）。

&#x20;

**提示：**

* 请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
* 在 Java 中，编译器使用[二进制补码](https://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6%E8%A1%A5%E7%A0%81/5295284)记法来表示有符号整数。因此，在 **示例 3** 中，输入表示有符号整数 `-3`。

示例 1：

{% code overflow="wrap" %}

```
输入：n = 00000000000000000000000000001011
输出：3
解释：输入的二进制串 
00000000000000000000000000001011 中，共有三位为 '1'。
```

{% endcode %}

示例2：

{% code overflow="wrap" %}

```
输入：n = 00000000000000000000000010000000
输出：1
解释：输入的二进制串 00000000000000000000000010000000 中，共有一位为 '1'。
```

{% endcode %}

示例3:

{% code overflow="wrap" %}

```
输入：n = 11111111111111111111111111111101
输出：31
解释：输入的二进制串 11111111111111111111111111111101 中，共有 31 位为 '1'。
```

{% endcode %}

**提示：**

* 输入必须是长度为 `32` 的 **二进制串** 。

**进阶**：

* 如果多次调用这个函数，你将如何优化你的算法？

## Solution

{% tabs %}
{% tab title="Go" %}

```go
func hammingWeight(num uint32) (count int) {
    for ; num > 0; num &= (num-1) {
        count++
    }
    return
}
```

{% endtab %}

{% tab title="C++" %}

```cpp
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Go" %}

```go
func hammingWeight(num uint32) (count int) {
    for ; num > 0; num -= (num & -num) {
        count++
    }
    return
}
```

{% endtab %}
{% endtabs %}
