让我们现在假设答案为零0。取 N 的二进制表示。从最高有效位 (MSB) 到最低有效位 (LSB),一一对应。如果您收到0,请跳过。如果您得到1,则将其与答案按位或(将1 保持在同一位置)并查看答案是否在从L 到R 的范围内。如果Answer 小于等于R(假设R 包含在内),保持位为1(即使它小于L)。如果Answer 大于R,则将该位恢复为0 并转到N 中的下一位。
示例 1:
N = 10 十进制,1010 二进制。
L = 5。
R = 15。
Answer = 0。
我们从N 的MSB 1 开始。
Answer OR 1000= 1000 二进制在L 和R 之间。我们保留它并移至N 中的下一位。
下一位是0。我们什么都不做,继续下一步。
下一位是1。 Answer 或 0010 = 1010,介于 L 和 R 之间。我们保留它并继续前进。
下一位是0。我们什么都不做。我们在N 的末尾。我们有答案。
Answer = 1010.
示例 2:N = 45 (101101),L = 32,R = 36。
Answer 或 100000 = 100000 是 32,介于 L 和 R 之间。我们将其保留为1 并继续。
Answer 或 1000 = 101000 这是 40。大于 R。我们将回复回复到100000 并继续。
Answer 或 100 = 100100 这是 36。这是 R。另一个优化:我们可以在此停止,因为与 Answer 进行或运算现在将增加其值超过 R。
可以进行更多优化,例如如果N 和R 相等,则R 应该是答案。
在某些情况下,答案可能是0(例如N = 45、L = 16、R = 16)。可以根据问题的具体情况以L 作为答案。