본문 바로가기
알고리즘 문제풀이/leetcode

[leetcode 191] Number of 1 Bits

by m2162003 2020. 11. 30.

Write a function that takes an unsigned integer and returns the number of '1' bits it has (also known as the Hamming weight).

Note:

  • Note that in some languages such as Java, there is no unsigned integer type. In this case, the input will be given as a signed integer type. It should not affect your implementation, as the integer's internal binary representation is the same, whether it is signed or unsigned.
  • In Java, the compiler represents the signed integers using 2's complement notation. Therefore, in Example 3 above, the input represents the signed integer. -3.

Follow up: If this function is called many times, how would you optimize it?

 

Example 1:

Input: n = 00000000000000000000000000001011 Output: 3 Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits.

Example 2:

Input: n = 00000000000000000000000010000000 Output: 1 Explanation: The input binary string 00000000000000000000000010000000 has a total of one '1' bit.

Example 3:

Input: n = 11111111111111111111111111111101 Output: 31 Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one '1' bits.

 

Constraints:

  • The input must be a binary string of length 32

2진수로 표현된 비트에서 1bit의 개수를 센다.

 

1. 나누면서 세기

2로 나눈 나머지를 더한다.

class Solution {
public:
    int hammingWeight(uint32_t n) {
        
        int cnt = 0;
        while(n!=0){
            cnt += (n%2) & 1;
            n/=2;
        }
        return cnt;
    }
};

 

2. 비트 연산 이용

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        while(n>0){
            cnt += 0x1 & n;
            n = n>>1;
        }
        return cnt;
    }
};

 

3. 비트 연산 심화

n과 n-1을 &연산한다.

예를 들어 1110'1'00이 있다고 해보자. 여기서 1을 빼면 1110'0'11이 된다.

''표시를 한 이유는 비트 변화를 잘 보기 위해서다. 오른쪽 끝에 있는 1을 기준으로 비트가 전부 뒤바뀐다.

그렇기 때문에 둘을 &연산하면 오른쪽 1연산은 0이 된다. 그러면 남은 1bit의 개수는 n-1이다.

 

이런식으로 n이 0이 될때까지 진행하여 연산한 횟수를 리턴한다.

class Solution {
public:
    int hammingWeight(uint32_t n) {
        
        int cnt = 0;
        while(n!=0){
            n = n & (n-1);
            cnt++;
        }
        return cnt;
    }
};

댓글