为什么 INT_MAX & x = x?

Why is INT_MAX & x = x?

在做spoj上的ANDROUND题时,我想为我的线段树编写查询函数。在 l, r 超出范围的情况下,我需要 return 一个数字,在进行 BITWISE AND 运算时,不会改变答案。

在其中一个解决方案中,我观察到任何数字与 INT_MAX 的按位与将 return 我们的数字本身。

为什么会这样?

因为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