【发布时间】:2021-06-23 06:49:40
【问题描述】:
LC:https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/
public int findMaximumXOR(int[] nums) {
int max = 0, mask = 0;
for (int i = 31; i >= 0; i--){
mask = mask | (1 << i);
Set<Integer> set = new HashSet<>();
for(int num : nums){
int left = num & mask
set.add(left);
}
int greed = max | (1 << i);
for (int prefix : set){
if (set.contains(greed ^ prefix)) {
max = greed;
break;
}
}
}
return max;
}
有人能解释一下当我们在 nums[i] 上应用 AND 运算符时会发生什么,而且掩码似乎越来越小(从 2^31、2^30...开始)
int left = num & mask
我从 cmets 知道它应该保留左侧位而忽略右侧位,但我仍然不确定这段代码背后发生了什么。
【问题讨论】:
标签: algorithm bit-manipulation bitmask bitwise-and