C 二进制两个连续的1位

C 二进制两个连续的1位,c,C,我尝试用C实现,它输出整数中两个连续的1位的数目,而不重叠。这是我的代码: #include <stdio.h> int numPairs(int num) { int count = 0; while (num) { num = (num & (num << 1)); count++; } return count / 2; } int main(){ printf("%d\t", nu

我尝试用C实现,它输出整数中两个连续的1位的数目,而不重叠。这是我的代码:

#include <stdio.h>

int numPairs(int num) {
    int count = 0;
    while (num) {
        num = (num & (num << 1));
        count++;
    }
    return count / 2;
}

int main(){
    printf("%d\t", numPairs(10000));
    printf("%d\t", numPairs(146));
    printf("%d\t", numPairs(7645));
    printf("%d\t", numPairs(16383));
    return 0;
}
#包括
int numPairs(int num){
整数计数=0;
while(num){

num=(num&(num您的方法不合适:


计算表达式为空所需的迭代次数
n=n&(n如果速度很重要,也可以通过位操纵操作完成:

int numPairs(uint32_t x) {
    return __builtin_popcount((((x ^ 0x55555555) + 0x55555555) ^ 0x55555555) & x);
}

这将在每个不相交的2位1组的高位中产生1位,然后对1位进行计数。

“但输出应为1 0 3 7”.为什么?
count
的值是
3
在循环结束时,在
返回它的一半之前,它是
1
@CinCout,因为7645是0x1dd+1,用于解释OP使用的算法。我正在考虑一个类似于您的解决方案,但不确定C标准是否确保在从有符号到无符号。对于2s补码实现,我想位模式是不变的,但它一般是可移植的吗?@4386427:对于非2的补码体系结构,我们无法对符号位的位置和填充位的潜在存在做出假设,因此没有完全针对有符号整数指定问题。除了助长我喜欢的语言律师讨论之外,这些考虑没有实际的应用,但是OP应该使
num
无符号以清晰明了。
int numPairs(uint32_t x) {
    return __builtin_popcount((((x ^ 0x55555555) + 0x55555555) ^ 0x55555555) & x);
}