1. >> 和 >>>
>>
is
arithmetic shift right, >>>
is
logical shift right.
In an arithmetic shift, the sign bit is extended to preserve the signedness of the number.
For example: -2 represented in 8 bits would be 11111110
(because
the most significant bit has negative weight). Shifting it right one bit using arithmetic shift would give you 11111111
,
or -1. Logical right shift, however, does not care that the value could possibly represent a number; it simply moves everything to the right and fills in from the left with 0s. Shifting our -2 right one bit using logical shift would give 01111111
.
public class Solution {
public int singleNumber(int[] nums) {
int [] counts = new int [32];
for ( int i = 0; i < 32; i ++ ){
for ( int j = 0; j < nums.length; j ++ ){
counts[i] += (nums[j] >> i) & 1;
}
}
int res = 0;
for ( int i = 31; i >= 0; i -- ){
res += counts[i] % 3;
if ( i > 0 )
res <<= 1;
}
return res;
}
}