Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到C中不同的第一位?_C_Bit Manipulation - Fatal编程技术网

如何找到C中不同的第一位?

如何找到C中不同的第一位?,c,bit-manipulation,C,Bit Manipulation,我想比较C中的整数,问题是找到不同的最低有效位。C语言中最快的方法是什么 例如: Bit 3210 ---- a = 13 (binary 1101) b = 9 (binary 1001) ^ 这里的结果应该是2,因为位2是第一个不同的位。提供了一个非常好的,呃,位旋转黑客的集合,附带了性能/优化讨论。对于您的问题(来自该站点),您可以使用乘法和查找策略: unsign

我想比较C中的整数,问题是找到不同的最低有效位。C语言中最快的方法是什么

例如:

               Bit
               3210
               ----
a = 13 (binary 1101)
b = 9  (binary 1001)
                ^
这里的结果应该是2,因为位2是第一个不同的位。

提供了一个非常好的,呃,位旋转黑客的集合,附带了性能/优化讨论。对于您的问题(来自该站点),您可以使用乘法和查找策略:

unsigned int c = a ^ b;  
int r;           // result goes here
static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = MultiplyDeBruijnBitPosition[((uint32_t)((c & -c) * 0x077CB531U)) >> 27];
参考资料:

  • “”-解释上述代码的工作原理
ffs()
from
返回第一个位集的位置, 其中,从最低有效位的
1
开始对位进行编号 (和
ffs(0)
返回零):

#包括
整数位计数(uint32位){
位=(位和0x5555)+(位>>1和0x5555);
位=(位&0x33333333)+(位>>2&0x33333333);
位=(位和0x0F0F)+(位>>4和0x0F0F);
位=(位和0x00ff00ff)+(位>>8和0x00ff00ff);
返回(位和0x0000ffff)+(位>>16和0x0000ffff);
}
int func(无符号a,无符号b){
无符号x=a^b;
返回x位u计数((x&(-x))-1):-1;
}

执行异或运算并找到第一个设置位。要从左侧或右侧找到第一个位,请查找编译器内部函数;通常这是由硬件本地提供的,并由编译器方便地公开。
c
是相应位的值(如1,2,4,8,…),而不是其位置(如0,1,2,3,…),对吗?不要使用带符号的整数。不能保证使用二的补码算法。使用unsigned int.@self。编辑答案以使用乘法和查找策略。@EOF编辑答案以使用乘法和查找策略。@herohuyongtao单凭
位旋转黑客链接就绝对值得一试:)感谢您的回答,现在使用XOR,但GCC中的u内置ffs而不是string.h中的ffs!为什么VS找不到
strings.h
?@herohuyongtao:strings.h(或string.h)是C的POSIX扩展,可能在所有符合标准的C编译器上都不可用。@herohuyongtao:我没有测试它,但对于Visual Studio,它似乎做了类似的工作。@herohuyongtao它只是一个转包函数。这比使用对数函数进行分包要好。
unsigned a = 0x0D;
unsigned b = 0x09;

unsigned x = a ^ b;
int pos = ffs(x) - 1;
if (pos == -1) {
   // a and b are equal
} else {
   // pos is the position of the first difference 
}
#include <stdint.h>

int bit_count(uint32_t bits) {
    bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
    bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
    bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
    bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
    return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}

int func(unsigned a, unsigned b){
    unsigned x = a ^ b;
    return x ? bit_count((x&(-x))-1) : -1;
}