C 二进制两个连续的1位
我尝试用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
#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);
}