2595. 奇偶位数
链接: 2595. 奇偶位数
给你一个 正 整数n
。
用even
表示在n
的二进制形式(下标从0
开始)中值为1
的偶数下标的个数。
用odd
表示在n
的二进制形式(下标从0
开始)中值为1
的奇数下标的个数。
返回整数数组answer
,其中answer = [even, odd]
。
题解
1. 基本操作
class Solution {
public:
vector<int> evenOddBit(int n) {
vector<int> res(2);
int w = 0;
while (n) {
if (n & 1) {
++res[w % 2];
}
++w;
n >>= 1;
}
return res;
}
}; // By Heng_Xin
class Solution {
public:
vector<int> evenOddBit(int n) {
vector<int> ans(2);
for (int i = 0; n; i ^= 1, n >>= 1)
ans[i] += n & 1;
return ans;
}
};
// 作者:灵茶山艾府
// 链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/solutions/2177848/er-jin-zhi-ji-ben-cao-zuo-pythonjavacgo-o82o2/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2. 位掩码 + 库函数
利用位掩码0x55555555
(二进制的 ),取出偶数下标比特和奇数下标比特,分别用库函数统计 的个数。
本题由于 范围比较小,取 0x5555 作为位掩码。
class Solution {
public:
vector<int> evenOddBit(int n) {
const int MASK = 0x5555;
return {__builtin_popcount(n & MASK), __builtin_popcount(n & (MASK >> 1))};
}
};
// 作者:灵茶山艾府
// 链接:https://leetcode.cn/problems/number-of-even-and-odd-bits/solutions/2177848/er-jin-zhi-ji-ben-cao-zuo-pythonjavacgo-o82o2/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
注: C/C++中__builtin_popcount()的使用及原理 (函数功能: 返回输入数据中,二进制中‘1’的个数。)