昨天的周赛有一道题:将整数减少到零需要的最少操作数。
这题涉及到对最低比特位的操作,周赛结束后看题解,发现我的思路是没有问题的,但是在代码实现上磕磕绊绊,归根结底是对位操作的掌握不够,看大佬们的题解中对 lowbit 的实现都是x & (-x)
,遂在此记录一下对于x & (-x)
的理解以及其它常用的位运算。
x & (-x)
-x
在计算机中是以 x
的补码形式存储的,计算方式是对 x
按位取反后加 1,即(~x)+1
, 也就是说x & (-x) == x & (~x + 1)
。
那么,对于整数运算 x & (-x)
有:
- 当 x 为 0 时,即 0 & 0,结果为 0。
- 当 x 为奇数时,最后一个比特位为 1,取反后变成 0,加 1 后不产生进位,对前面的位不产生影响,因此 x 和-x 除了最后一位外,前面的位相反,按位进行与操作后结果均为 0,最后一位是 1&1,结果为 1。即 x 为奇数时,
x & (-x) = 1
。 - 当 x 为偶数时,分两种情况讨论:
- 当 x 为偶数且为