力扣421.数组中两个数的最大异或和
-
- __builtin_clz():求出mx二进制最高位之后的0的个数
-
class Solution { public: int findMaximumXOR(vector<int>& nums) { int mx = *max_element(nums.begin(),nums.end()); //__builtin_clz函数 int high_bit = mx ? 31 - __builtin_clz(mx) : -1; //mask为10000,11000,11100,11110,11111... int ans = 0,mask = 0; unordered_set<int> seen; for(int i=high_bit;i>=0;i--) { seen.clear(); //每次补一个1 mask |= 1 << i; int new_ans = ans | (1<<i); //第i为是否能是1? for(int x:nums) { x &= mask; //见上面4. //转换 if(seen.contains(new_ans^x)) { //说明能异或出new_ans ans = new_ans; break; } seen.insert(x); } } return ans; } };