我有 long long int N,我需要从指定索引开始向左计算设置位,然后向右计算。当二进制中的 N 以 1(如 5 或 9)结尾时,我的代码工作正常,但对于那些以 0 结尾(如 10 或 20)的 N 则失败
所以这是我的尝试:
int countSetLeft(long long int num, int position) {
int count = 0;
for (int i = 0; i < position; i++) {
if ((num >> i) & 1)
count++;
}
return count;
}
int countSetRight(long long int num, int position) {
int count = 0;
for (int i = position; i < 64; i++) {
if ((num >> i) & 1)
count++;
}
return count;
}
形成一个无符号掩码并移位直到0。
int countSetLeft(long long int num, int position) {
int count = 0;
unsigned long long mask = 1ull << position;
while (mask) {
count += !!(num & mask); // !! to get 0 or 1 after the &
mask <<= 1;
}
return count;
}
使用
mask >>= 1;
表示另一个方向。
TBD:如果
position
超出移位范围该怎么办。