在 spoj 上做 ANDROUND 问题时,我想为我的段树编写查询函数。在 l、r 超出范围的情况下,我需要返回一个数字,该数字在执行 BITWISE AND 运算时不会改变答案。
在其中一个解决方案中,我观察到任何带有 INT_MAX 的数字的按位与都会返回数字本身。
为什么会这样?
在 spoj 上做 ANDROUND 问题时,我想为我的段树编写查询函数。在 l、r 超出范围的情况下,我需要返回一个数字,该数字在执行 BITWISE AND 运算时不会改变答案。
在其中一个解决方案中,我观察到任何带有 INT_MAX 的数字的按位与都会返回数字本身。
为什么会这样?
因为 INT_MAX 是一个仅由 1 表示的数字。对于 32 位 int,它由位序列表示11111111 11111111 11111111 11111111
。现在,&
操作员检查两个数字在某个索引处的值是否为 1(例如,如果两个数字在索引 5 处的值均为 1,则结果在索引 5 处的值为 1)。如果是这种情况,则结果在该索引中的值为 1,否则,它将在结果的该索引中存储值为 0。
因此,如果您考虑 INT MAX 数字 - 又是位序列11111111 11111111 11111111 11111111
和数字 2,例如,它由位序列表示00000000 00000000 00000000 00000010
。只有在第二小的索引中,两个数字都有一个 1,所以只有那里的结果才会有 1,而其他地方的结果都是 0。
11111111 11111111 11111111 11111111
&
00000000 00000000 00000000 00000010
=
00000000 00000000 00000000 00000010