题目描述:
给你一个 正 整数 n
。
用 even
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的偶数下标的个数。
用 odd
表示在 n
的二进制形式(下标从 0 开始)中值为 1
的奇数下标的个数。
请注意,在数字的二进制表示中,位下标的顺序 从右到左。
返回整数数组 answer
,其中 answer = [even, odd]
。
代码思路:
- 初始化结果数组:
ans = [0, 0]
:这个数组用来存储结果,其中ans[0]
表示偶数下标位置上值为1的个数,ans[1]
表示奇数下标位置上值为1的个数。
- 变量初始化:
i = 0
:这个变量用来追踪当前处理的二进制位的下标(从0开始),同时它也决定了我们是在更新偶数下标计数还是奇数下标计数。由于初始时我们处理的是最右边的位(即最低位),所以i
从0开始,表示第一个下标是偶数。
- 遍历二进制位:
- 使用
while n:
循环来遍历n
的二进制表示中的每一位。当n
变为0时,表示所有的位都已经被处理完毕。
- 使用
- 检查当前位是否为1:
n & 1
:这个操作会对n
进行按位与操作,与1进行按位与可以提取n
的最低位(即最右边的位)。如果最低位是1,则结果为1;如果是0,则结果为0。ans[i] += n & 1
:如果当前位是1,则将对应下标(偶数或奇数)的计数加1。
- 右移并更新下标:
n >>= 1
:将n
右移一位,这样下一次循环就可以处理n
的下一个二进制位了。i ^= 1
:使用异或操作来切换下标的奇偶性。异或1可以切换一个整数的二进制表示中的最低位(0变1,1变0),因此在这里用来在偶数下标和奇数下标之间切换。
- 返回结果:
- 当所有的二进制位都被处理完毕后,循环结束,返回
ans
数组,其中包含了偶数下标和奇数下标位置上值为1的个数。
- 当所有的二进制位都被处理完毕后,循环结束,返回
代码实现:
class Solution:def evenOddBit(self, n: int) -> List[int]:ans = [0, 0]i = 0while n:ans[i] += n & 1n >>= 1i ^= 1return ans