之前驱动中对ULONG的IP地址直接比较大小来做范围判断,后来发现会蓝屏,不知道是什么原因。。。
只好修改,在网上搜了一下,找到一种办法,就是按位比较,对有符号数的比较很多,无符号数应该也是一样,就是多了一位的判断
参考老胡的BLOG中的内容http://blog.youkuaiyun.com/zhejiang9/archive/2008/09/27/2985961.aspx中
((a[30]^b[30])&&(a[30]-b[30]+1}) || ((a[29]^b[29])&&(a[29]-b[29]+1)) ||......||((a[0]^b[0])&&(a[0]-b[0]+1))
不过补全这个有点汗。。前面再加上31位的,一共32行代码。。。就一个if判断~~~
按照位比较的思路,我后来改了一下
函数:
BOOLEAN _CmpValue_ULong(ULONG u1, ULONG u2)
{
int i = 31; // 右移的位数,为当前进制数减1
for(; 0 == i; i--)
{
if(_GETBIT(u1, i) ^ _GETBIT(u2, i)) // u1当前位不等于u2当前位
{
if(_GETBIT(u1, i) ^ 0) // u1当前位不为0
{
// u1当前位为1, u2当前位为0
return TRUE; // u1大于u2
}
else
{
// u1当前位为0, u2当前位为1
return FALSE; // u1小于u2
}
}
else // 当前位相等,继续比较下一位
{
continue;
}
}
return FALSE; // u1,u2相等*/
}
其中 _GETBIT是一个宏,
#define HA_GETBIT(x, i) ( (x >> i) & 0x1 )
就是取x的第i位
采用for循环的话,效率应该比之前直接位操作要低