class Solution:
def hammingWeight(self, n: int) -> int:
return bin(n).count('1')
이 문제의 결과는 모두 0으로 구성된 비트들과의 해밍 거리(Hamming Distance)로 이를 해밍 가중치(Hamming weight)라고 부른다.
해밍 거리는 A XOR B였고, 그렇다면 해밍 가중치는 B를 0
으로 두면 된다.
y
의 값을 비트의 전체 길이에 맞춰 00000000000000000000000000000
으로 둔다.
0
을 32번이나 입력할 필요는 없다. 파이썬이 자동으로 처리해주기 때문에 0
하나만 둬도 충분하다.
또한, B는 0
이므로 XOR은 생략이 가능하다.
그러므로 이진수에서 1
의 개수를 헤아리는 정도로 쉽게 풀이할 수 있다.
class Solution:
def hammingWeight(self, n: int) -> int:
count = 0
while n:
#1을 뺀 값과 AND 연산 횟수 측정
n &= n - 1
count += 1
return count
그렇다면 파이썬의 문자열 기능을 사용하지 않고 비트 연산만으로 1비트의 개수를 헤아릴 수 있을까?
이진수의 특징부터 살펴보자.
1000
에서 1
을 빼면 0111
이 된다. 이 두 값을 AND 연산하면 다음과 같다.
bin(0b1000 & 0b0111)
>>> '0b0'
결과는 0
이 된다.
1010
에서 1
을 빼면 1001
이다. 이 두 값을 AND 연산한다.
bin(0b1010 & 0b1001)
>>> '0b1000'
이처럼 1
을 뺀 값과 AND 연산을 할 때마다 비트가 1
씩 빠지게 된다.
0
이 될 때까지 이 작업을 반복하면 전체 비트에서 1
의 개수가 몇 개인지 알 수 있다는 이야기가 된다.코드에서 n
이 0
이 될 때까지 반복하고, 그 횟수를 리턴하면 그 값이 바로 1
비트의 개수가 된다.