为什么 (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
因此,直到最右边的设置位的所有位都将被反转
为什么这个 属性 成立?
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
因此,直到最右边的设置位的所有位都将被反转