正在阅读:巧用Win32 API函数增强VB位操作功能巧用Win32 API函数增强VB位操作功能

2005-09-15 10:14 出处: 作者:刘琦 责任编辑:moningfeng

  至此字节变量的移位问题已经得到解决,现在再来看单字和双字的移位,它们分别对应VB中的Integer和Long类型。用乘以2和除以2的方法还行吗?用几个数试验一下就会发现,这个方法失灵了。请看各种运算结果的对比:

  A=1001’0111’1110’1100

  右移一位: 0100’1011’1111’0110

  (A/2):1100’1011’1111’0110

  问题好象变的有点复杂了,其实导致这个方法失灵的最根本的原因是VB把Integer和Long类型当做有符号数理解,把一个有符号数乘以2或除以2,最高位(即符号位)根本就没有参与运算,这一点从上面的运算结果对比就可以看出来:把A除以2 以后最高位还是1,根本就没有变,而右移一位后最高位补入的是0,两种运算的结果自然是相去甚远。不只是符号位的问题,如果选用其它的数据来对比还会发现更多的问题,这里就不再赘述了。难道就真的没有办法了吗?办法当然是有的,既然已经实现了字节的移位操作,那么可以 用“分而治之”的策略,把Integer变量一分为二,拆成两个字节,把这两个字节交给ShLB()或ShRB(),把它俩各移一位,最后把移位后的两字节重新组合成一个Integer变量就是移位后的结果了,这不就实现了Integer类型变量的移位了吗。这种方法完全绕过了有符号数的符号位给我们带来的众多麻烦,顺利的实现了目的。用这种方法需要注意一点:如果是左移,要保证把低字节的最高位移入高字节的最低位,反之如果是右移,要把高字节的最低位移入低字节的最高位。从下面的代码中可以看到实现的过程:

Private Function ShLW_By1Bit(ByVal Word As Integer) As Integer

'把一个字左移一位的函数, 参数Word是待移位的字,函数返回移位结果

'INPUT-------------------------------

'Word 源操作数

'OUTPUT------------------------------

'返回值 移位结果

'last updated by Liu Qi 2004-3-24


Dim HiByte As Byte, LoByte As Byte

'把字拆分为字节

HiByte = Hi(Word): LoByte = Lo(Word)

'把高字节左移一位,保证把低字节的最高位移入高字节的最低位

HiByte = ShLB_By1Bit(HiByte) Or IIf((LoByte And &H80) = &H80, &H1, &H0)

LoByte = ShLB_By1Bit(LoByte) '低字节左移一位

'把移位后的字节再重新组合成字

ShLW_By1Bit = Con(HiByte, LoByte)

End Function


  至于Long类型,和Integer类型一样,属于有符号数,也不能用乘以2和除以2的方法实现移位。我们只好和处理Integer类型一样如法炮制,用分而治之的方法实现移位。具体过程不再赘述,请参看代码。

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品