- 论坛徽章:
- 0
|
回复 #3 zwylinux 的帖子
为啥问题2是
2、对于32位的机器 (x1 >> 2 ^ (x2 >> 2 ;
我在写一个函数
u_int8_t compare (u_int32_t x1, u_int32_t x2, u_int8_t start_pos, u_int8_t end_pos);
输入: x1, x2需要比较的两个数 (输入的两个数的start_pos之前的位是相同的)
start_pos, end_end 需要比较的起始和结束位置
输出: 比较部分中开始不同的位置,如果完全完全相同则返回0
比如compare(1100100..., 1100110..., 3, 7),返回是6。
比如compare(1100100..., 1100110..., 3, 5),返回是0。
我用的是如下函数。
u_int8_t compare (u_int32_t x1, u_int32_t x2, u_int8_t start_pos, u_int8_t end_pos) {
u_int8_t i;
u_int32_t r = x1 ^ x2;
r = r << start_pos -1;
for (i=0; i<end_pos-start_pos; i++) {
if ((r & 0x80000000) == 0)
break;
r = r << 1;
}
if (i==0)
return start_pos;
else
return i == end_pos-start_pos ? 0 : start_pos+i;
}
因为这函数会被多次调用,因此对这个函数的效率要求非常高。不知道有没其它更优的方法,比如不用for loop或者用汇编? 我对汇编没有任何概念。。。
[ 本帖最后由 yacare 于 2007-7-13 02:42 编辑 ] |
|