A clear explanation of computing the Hamming distance between two integers using XOR and bit counting.
Problem Restatement
We are given two integers x and y.
We need to return the Hamming distance between them.
For two integers, the Hamming distance is the number of bit positions where their binary representations are different. The official problem asks us to return the Hamming distance between two integers x and y.
For example:
x = 1
y = 4Their binary forms are:
1 = 0001
4 = 0100They differ in two positions:
0001
0100
^ ^So the answer is:
2Input and Output
| Item | Meaning |
|---|---|
| Input | Two integers x and y |
| Output | Number of bit positions where x and y differ |
| Constraint | 0 <= x, y <= 2^31 - 1 |
Function shape:
def hammingDistance(x: int, y: int) -> int:
...Examples
Example 1:
x = 1
y = 4Binary:
1 = 0001
4 = 0100Different positions:
0001
0100
^ ^Answer:
2Example 2:
x = 3
y = 1Binary:
3 = 0011
1 = 0001Only one bit differs:
0011
0001
^Answer:
1Example 3:
x = 0
y = 0Both numbers have the same binary representation.
Answer:
0First Thought: Compare Bits One by One
A direct approach is to inspect every bit position.
Since the constraints fit inside 31 bits, we can check bits from 0 to 30.
For each bit position, extract the bit from x and y.
If they differ, increment the answer.
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
distance = 0
for bit in range(31):
bit_x = (x >> bit) & 1
bit_y = (y >> bit) & 1
if bit_x != bit_y:
distance += 1
return distanceThis works because the Hamming distance is exactly the count of positions where the two bits differ.
Problem With Manual Bit Comparison
The bit-by-bit approach is already efficient because there are only 31 relevant bits.
But the code is more verbose than needed.
There is a bit operation that directly marks all different positions: XOR.
Key Insight
XOR has the exact behavior we need.
For each bit:
Bit in x | Bit in y | x ^ y bit |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
So x ^ y has 1 exactly at positions where x and y differ.
Then the answer is the number of 1 bits in x ^ y.
For example:
x = 1 # 0001
y = 4 # 0100
x ^ y = 5 # 0101The result 0101 has two 1 bits.
So the Hamming distance is:
2Algorithm
Compute:
diff = x ^ yThen count the number of set bits in diff.
In Python, this can be done directly:
diff.bit_count()Return that count.
Correctness
For every bit position, XOR returns 1 exactly when the two input bits are different.
Therefore, after computing:
diff = x ^ ythe number of 1 bits in diff equals the number of bit positions where x and y differ.
The Hamming distance is defined as exactly that count.
So returning the number of set bits in x ^ y gives the correct answer.
Complexity
| Metric | Value | Why |
|---|---|---|
| Time | O(1) | Inputs fit in a fixed integer width |
| Space | O(1) | Only one extra integer is used |
For arbitrary-size integers, the time depends on the number of machine words used to store the integers.
Implementation
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
return (x ^ y).bit_count()Code Explanation
The expression:
x ^ ycreates a number whose 1 bits mark the positions where x and y are different.
Then:
.bit_count()counts how many 1 bits that number has.
That count is the Hamming distance.
Alternative Implementation Without bit_count
Some languages or older Python versions may not have bit_count.
We can count set bits manually using Brian Kernighan’s trick.
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
diff = x ^ y
distance = 0
while diff:
diff &= diff - 1
distance += 1
return distanceThe operation:
diff &= diff - 1removes the lowest set bit from diff.
So the loop runs once per 1 bit.
Testing
def run_tests():
s = Solution()
assert s.hammingDistance(1, 4) == 2
assert s.hammingDistance(3, 1) == 1
assert s.hammingDistance(0, 0) == 0
assert s.hammingDistance(0, 7) == 3
assert s.hammingDistance(15, 0) == 4
assert s.hammingDistance(8, 8) == 0
assert s.hammingDistance(2**31 - 1, 0) == 31
print("all tests passed")
run_tests()Test meaning:
| Test | Why |
|---|---|
1, 4 | Standard example |
3, 1 | One differing bit |
0, 0 | Same numbers |
0, 7 | Count all set bits in one number |
15, 0 | Multiple low bits differ |
8, 8 | Equal non-zero numbers |
2^31 - 1, 0 | Maximum 31-bit all-ones case |