计算左侧和右侧的设置位

问题描述 投票:0回答:1

我有 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;
}
c bitwise-operators
1个回答
0
投票

形成一个无符号掩码并移位直到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
超出移位范围该怎么办。

© www.soinside.com 2019 - 2024. All rights reserved.