为什么 (x-1) 从 x 的最右边设置位开始切换所有位?

Why does (x-1) toggle all the bits from the rightmost set bit of x?

为什么这个 属性 成立?

say the kth bit from right side is the first set bit in number 'x'. (x-1) will toggle every bit upto kth bit from right side.

我可以通过编写数字的位序列来验证这个 属性 但我不明白为什么这个 属性 是真的?任何人都可以通过简单的证据或直觉帮助我说明为什么会这样吗?

如果你执行 (x-1) 也是同样的原因,其中 x 是以 10 为底的整数,右边的所有零(如果有的话)都将变成九。

9324930000000 - 1 = 9324929999999

我们来做个手减法

  xxx100...00
- xxx000...01
─────────────
  xxx011...11

x表示我们不关心的位

从右边开始,10 - 1 = 1,从下一列借1

然后下一个是0 - 0,减去借位,结果也是0 - 1 = 1借位1。这个数列一直持续到减数位为1,现在我们有1 - 0 - borrow = 1 - 1 = 0

因此,直到最右边的设置位的所有位都将被反转