不直接使用大于小于 比较两数大小

之前驱动中对ULONG的IP地址直接比较大小来做范围判断,后来发现会蓝屏,不知道是什么原因。。。

只好修改,在网上搜了一下,找到一种办法,就是按位比较,对有符号数的比较很多,无符号数应该也是一样,就是多了一位的判断

参考老胡的BLOG中的内容http://blog.csdn.net/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循环的话,效率应该比之前直接位操作要低

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值