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;
}
};
'알고리즘 문제풀이 > leetcode' 카테고리의 다른 글
[leetcode 344] Reverse String (0) | 2020.12.01 |
---|---|
[leetcode 350] Intersection of Two Arrays II (0) | 2020.12.01 |
[leetcode 237] Delete Node in a Linked List (0) | 2020.11.27 |
[leetcode 202] Happy Number (0) | 2020.11.25 |
[leetcode 204] Count Primes (0) | 2020.11.25 |
댓글