基于(min,max)与scalar计算异或最值的O(1)优化方案咨询
求[min, max]中x与scalar异或的最大/最小值(O(1)解法)
核心思路
异或操作的特性是:二进制位不同则结果为1,相同则为0。要最大化x^scalar,需让结果的二进制高位尽可能多为1;要最小化则需让高位尽可能多为0。我们通过逐位确定结果的每一位,利用位掩码判断区间内是否存在符合条件的x,全程仅需遍历固定位数(如32位/64位),时间复杂度为O(1)。
最大值求解步骤
- 初始化
max_result为0,从最高位(如32位整数的第31位)到第0位依次遍历每一位i:- 尝试将当前位设为1,得到候选结果
candidate = max_result | (1 << i) - 计算掩码
mask = ~((1 << (i+1)) - 1),用于保留当前位以上的高位部分 - 确定x的当前位要求:要让
x^scalar的第i位为1,x的第i位必须与scalar的第i位相反,即x_bit = 1 ^ ((scalar >> i) & 1) - 构造x的前缀:
prefix = ((max_result ^ scalar) & mask) | (x_bit << i),该前缀固定了x的高位和当前位,低位可自由取值 - 判断前缀对应的区间
[prefix, prefix | ((1 << i) - 1)]是否与[min, max]有交集:若prefix <= max且(prefix | ((1 << i) - 1)) >= min,说明存在符合条件的x,将max_result更新为candidate
- 尝试将当前位设为1,得到候选结果
- 遍历完成后,
max_result即为x^scalar的最大值
最小值求解步骤
- 初始化
min_result为0,从最高位到第0位依次遍历每一位i:- 尝试将当前位设为0,候选结果
candidate = min_result - 计算掩码
mask = ~((1 << (i+1)) - 1) - 确定x的当前位要求:要让
x^scalar的第i位为0,x的第i位必须与scalar的第i位相同,即x_bit = ((scalar >> i) & 1) - 构造x的前缀:
prefix = ((min_result ^ scalar) & mask) | (x_bit << i) - 判断前缀对应的区间
[prefix, prefix | ((1 << i) - 1)]是否与[min, max]有交集:若存在交集,保留min_result为candidate;否则,将当前位设为1,min_result |= (1 << i)
- 尝试将当前位设为0,候选结果
- 遍历完成后,
min_result即为x^scalar的最小值
示例验证(min=10, max=20, scalar=50)
- 最大值求解到最后一位时,构造的prefix=13(13在[10,20]区间内),因此
13^50=63,得到正确的最大值 - 最小值求解可得x=16,
16^50=34,为区间内异或结果的最小值
内容的提问来源于stack exchange,提问作者Hyunsoo
相关产品推荐
相关产品推荐

