宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 4651|回复: 0

[VB成品源码] VB中位操作运算函数模块

[复制链接]
  • TA的每日心情
    开心
    2024-12-9 18:45
  • 签到天数: 124 天

    [LV.7]常住居民III

    admin 发表于 2010-12-21 16:36:09 | 显示全部楼层 |阅读模式

    欢迎您注册加入!这里有您将更精采!

    您需要 登录 才可以下载或查看,没有账号?注册

    x
    VB中不能直接进行位操作,刚好今天写段代码发现这个,和大家分享了……
    1. 'Module: BitPlus.Bas
    2. 'Code By Hermit @ SMTH , Jun. 1st,2000
    3. 'Email: mailtocw@sohu.com
    4. 'May these functions will help you, and
    5. 'Please keep this header if you use my code,thanks!
    6. '提供在VB下进行位运算的函数
    7. 'SHL 逻辑左移  SHR  逻辑右移
    8. 'SAL 算术左移  SAR  算术右移
    9. 'ROL 循环左移  ROR  循环右移
    10. 'RCL 带进位循环左移  RCR  带进位循环右移
    11. 'Bin 将给定的数据转化成2进制字符串
    12. '使用方法
    13. 'SHL SHR SAL SAR ROL ROR 基本类似,以SHL为例说明
    14. '可以移位的变量类型,字节(Byte),整数(Integer),长整数(Long)
    15. '返回值 True 移位成功, False 移位失败,当对非上述类型进行移位是会返回False
    16. 'Num 传引用变量,要移位的数据,程序会改写Num的值为运算后结果
    17. 'iCL 传值变量,要移位的次数,缺省值移位1次
    18. '例 Dim A As Integer
    19. '   A = &H10
    20. '如 SHL A    则移位后 A = &H20
    21. '如 SHL A,2  则移位后 A = &H40
    22. '如 SHL A,4  则移位后 A = &H00
    23. 'RCR与RCL类似,以RCL为例说明
    24. '这里需要多给定一个参数,即第一次移位时的进位值iCF
    25. 'Bin举例
    26. 'A = &H1
    27. '如 A 为字节,则 Bin(A) 返回值为 "00000001"
    28. '如 A 为整数,则 Bin(A) 返回值为 "0000000000000001"
    29. '如 A 为长整数,则 Bin(A) 返回值为 "00000000000000000000000000000001"
    30. '如果传入参数非上述类型时,返回值为 ""
    31. '更详细的信息,请参考相关汇编书籍
    32. '逻辑左移
    33. Public Function SHL(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    34. Boolean
    35. Dim i As Byte
    36. Dim bMask As Byte, iMask As Integer, lMask As Long
    37. Select Case VarType(Num)
    38. Case 2 '16 bits
    39.   For i = 1 To iCL
    40.     iMask = 0
    41.     If (Num And &H4000) <> 0 Then iMask = &H8000
    42.     Num = (Num And &H3FFF) * 2 Or iMask
    43.   Next
    44. Case 3 '32 bits
    45.   For i = 1 To iCL
    46.     lMask = 0
    47.     If (Num And &H40000000) <> 0 Then lMask = &H80000000
    48.     Num = (Num And &H3FFFFFFF) * 2 Or lMask
    49.   Next
    50. Case 17 '8 bits
    51.   For i = 1 To iCL
    52.     bMask = 0
    53.     If (Num And &H40) <> 0 Then bMask = &H80
    54.     Num = (Num And &H3F) * 2 Or bMask
    55.   Next
    56. Case Else
    57.   SHL = False
    58.   Exit Function
    59. End Select
    60. SHL = True
    61. End Function
    62. '逻辑右移
    63. Public Function SHR(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    64. Boolean
    65. Dim i As Byte
    66. Dim bMask As Byte, iMask As Integer, lMask As Long
    67. Select Case VarType(Num)
    68. Case 2 '16 bits
    69.   For i = 1 To iCL
    70.     iMask = 0
    71.     If (Num And &H8000) <> 0 Then iMask = &H4000
    72.     Num = (Num And &H7FFF) \ 2 Or iMask
    73.   Next
    74. Case 3 '32 bits
    75.   For i = 1 To iCL
    76.     lMask = 0
    77.     If (Num And &H80000000) <> 0 Then lMask = &H40000000
    78.     Num = (Num And &H7FFFFFFF) \ 2 Or lMask
    79.   Next
    80. Case 17 '8 bits
    81.   For i = 1 To iCL
    82.     bMask = 0
    83.     If (Num And &H80) <> 0 Then bMask = &H40
    84.     Num = (Num And &H7F) \ 2 Or bMask
    85.   Next
    86. Case Else
    87.   SHR = False
    88.   Exit Function
    89. End Select
    90. SHR = True
    91. End Function
    92. '算术左移
    93. Public Function SAL(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    94. Boolean
    95. SAL = SHL(Num, iCL)
    96. End Function
    97. '算术右移
    98. Public Function SAR(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    99. Boolean
    100. Dim i As Byte
    101. Dim bMask As Byte, iMask As Integer, lMask As Long
    102. Select Case VarType(Num)
    103. Case 2 '16 bits
    104.   For i = 1 To iCL
    105.     iMask = 0
    106.     If (Num And &H8000) <> 0 Then iMask = &HC000
    107.     Num = (Num And &H7FFF) \ 2 Or iMask
    108.   Next
    109. Case 3 '32 bits
    110.   For i = 1 To iCL
    111.     If (Num And &H80000000) <> 0 Then lMask = &HC0000000
    112.     Num = (Num And &H7FFFFFFF) \ 2 Or lMask
    113.   Next
    114. Case 17 '8 bits
    115.   For i = 1 To iCL
    116.     If (Num And &H80) <> 0 Then bMask = &HC0
    117.     Num = (Num And &H7F) \ 2 Or bMask
    118.   Next
    119. Case Else
    120.   SAR = False
    121.   Exit Function
    122. End Select
    123. SAR = True
    124. End Function
    125. '循环左移
    126. Public Function ROL(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    127. Boolean
    128. Dim i As Byte
    129. Dim bMask As Byte, iMask As Integer, lMask As Long
    130. Select Case VarType(Num)
    131. Case 2 '16 bits
    132.   For i = 1 To iCL
    133.     iMask = 0
    134.     If (Num And &H4000) <> 0 Then iMask = &H8000
    135.     If (Num And &H8000) <> 0 Then iMask = iMask Or &H1
    136.     Num = (Num And &H3FFF) * 2 Or iMask
    137.   Next
    138. Case 3 '32 bits
    139.   For i = 1 To iCL
    140.     lMask = 0
    141.     If (Num And &H40000000) <> 0 Then lMask = &H80000000
    142.     If (Num And &H80000000) <> 0 Then lMask = lMask Or &H1
    143.     Num = (Num And &H3FFFFFFF) * 2 Or lMask
    144.   Next
    145. Case 17 '8 bits
    146.   For i = 1 To iCL
    147.     bMask = 0
    148.     If (Num And &H40) <> 0 Then bMask = &H80
    149.     If (Num And &H80) <> 0 Then bMask = bMask Or &H1
    150.     Num = (Num And &H3F) * 2 Or bMask
    151.   Next
    152. Case Else
    153.   ROL = False
    154.   Exit Function
    155. End Select
    156. ROL = True
    157. End Function
    158. '循环右移
    159. Public Function ROR(ByRef Num As Variant, Optional ByVal iCL As Byte = 1) As
    160. Boolean
    161. Dim i As Byte
    162. Dim bMask As Byte, iMask As Integer, lMask As Long
    163. Select Case VarType(Num)
    164. Case 2 '16 bits
    165.   For i = 1 To iCL
    166.     iMask = 0
    167.     If (Num And &H8000) <> 0 Then iMask = &H4000
    168.     If (Num And &H1) <> 0 Then iMask = iMask Or &H8000
    169.     Num = (Num And &H7FFF) \ 2 Or iMask
    170.   Next
    171. Case 3 '32 bits
    172.   For i = 1 To iCL
    173.     lMask = 0
    174.     If (Num And &H80000000) <> 0 Then lMask = &H40000000
    175.     If (Num And &H1) <> 0 Then lMask = lMask Or &H80000000
    176.     Num = (Num And &H7FFFFFFF) \ 2 Or lMask
    177.   Next
    178. Case 17 '8 bits
    179.   For i = 1 To iCL
    180.     bMask = 0
    181.     If (Num And &H80) <> 0 Then bMask = &H40
    182.     If (Num And &H1) <> 0 Then bMask = bMask Or &H80
    183.     Num = (Num And &H7F) \ 2 Or bMask
    184.   Next
    185. Case Else
    186.   ROR = False
    187.   Exit Function
    188. End Select
    189. ROR = True
    190. End Function
    191. '带进位循环左移
    192. Public Function RCL(ByRef Num As Variant, Optional ByVal iCL As Byte = 1, Op
    193. tional ByVal iCf As Byte = 0) As Boolean
    194. Dim i As Byte, CF As Byte
    195. Dim bMask As Byte, iMask As Integer, lMask As Long
    196. CF = iCf
    197. Select Case VarType(Num)
    198. Case 2 '16 bits
    199.   For i = 1 To iCL
    200.     If CF = 0 Then
    201.        iMask = 0
    202.     Else
    203.        iMask = 1
    204.     End If
    205.     If (Num And &H4000) <> 0 Then iMask = iMask Or &H8000
    206.     If (Num And &H8000) <> 0 Then
    207.        CF = 1
    208.     Else
    209.        CF = 0
    210.     End If
    211.     Num = (Num And &H3FFF) * 2 Or iMask
    212.   Next
    213. Case 3 '32 bits
    214.   For i = 1 To iCL
    215.     If CF = 0 Then
    216.        lMask = 0
    217.     Else
    218.        lMask = 1
    219.     End If
    220.     If (Num And &H40000000) <> 0 Then lMask = lMask Or &H80000000
    221.     If (Num And &H80000000) <> 0 Then
    222.        CF = 1
    223.     Else
    224.        CF = 0
    225.     End If
    226.     Num = (Num And &H3FFFFFFF) * 2 Or lMask
    227.   Next
    228. Case 17 '8 bits
    229.   For i = 1 To iCL
    230.     If CF = 0 Then
    231.        bMask = 0
    232.     Else
    233.        bMask = 1
    234.     End If
    235.     If (Num And &H40) <> 0 Then bMask = bMask Or &H80
    236.     If (Num And &H80) <> 0 Then
    237.        CF = 1
    238.     Else
    239.        CF = 0
    240.     End If
    241.     Num = (Num And &H3F) * 2 Or bMask
    242.   Next
    243. Case Else
    244.   RCL = False
    245.   Exit Function
    246. End Select
    247. RCL = True
    248. End Function
    249. '带进位循环右移
    250. Public Function RCR(ByRef Num As Variant, Optional ByVal iCL As Byte = 1, Op
    251. tional ByVal iCf As Byte = 0) As Boolean
    252. Dim i As Byte, CF As Byte
    253. Dim bMask As Byte, iMask As Integer, lMask As Long
    254. CF = iCf
    255. Select Case VarType(Num)
    256. Case 2 '16 bits
    257.   For i = 1 To iCL
    258.     If CF = 1 Then
    259.        iMask = &H8000
    260.     Else
    261.        iMask = 0
    262.     End If
    263.     If (Num And &H8000) <> 0 Then iMask = iMask Or &H4000
    264.     If (Num And &H1) <> 0 Then
    265.        CF = 1
    266.     Else
    267.        CF = 0
    268.     End If
    269.     Num = (Num And &H7FFF) \ 2 Or iMask
    270.   Next
    271. Case 3 '32 bits
    272.   For i = 1 To iCL
    273.     If CF = 1 Then
    274.        lMask = &H80000000
    275.     Else
    276.        lMask = 0
    277.     End If
    278.     If (Num And &H80000000) <> 0 Then lMask = lMask Or &H40000000
    279.     If (Num And &H1) <> 0 Then
    280.        CF = 1
    281.     Else
    282.        CF = 0
    283.     End If
    284.     Num = (Num And &H7FFFFFFF) \ 2 Or lMask
    285.   Next
    286. Case 17 '8 bits
    287.   For i = 1 To iCL
    288.     If CF = 1 Then
    289.        bMask = &H80
    290.     Else
    291.        bMask = 0
    292.     End If
    293.     If (Num And &H80) <> 0 Then bMask = bMask Or &H40
    294.     If (Num And &H1) <> 0 Then
    295.        CF = 1
    296.     Else
    297.        CF = 0
    298.     End If
    299.     Num = (Num And &H7F) \ 2 Or bMask
    300.   Next
    301. Case Else
    302.   RCR = False
    303.   Exit Function
    304. End Select
    305. RCR = True
    306. End Function
    307. '将数值转化为二进制字符串
    308. Public Function Bin(ByVal Num As Variant) As String
    309. Dim tmpStr As String
    310. Dim iMask As Long
    311. Dim iCf As Byte, iMax As Byte
    312. Select Case VarType(Num)
    313. Case 2: iMax = 15 'Integer 16 bits
    314. Case 3: iMax = 31 'Long 32 bits
    315. Case 17: iMax = 7 'Byte 8  bits
    316. Case Else
    317.   Bin = ""
    318.   Exit Function
    319. End Select
    320. iMask = 1
    321. If iMask And Num Then
    322.    tmpStr = "1"
    323. Else
    324.    tmpStr = "0"
    325. End If
    326. For iCf = 1 To iMax
    327.    If iCf = 31 Then
    328.       If Num > 0 Then
    329.          tmpStr = "0" + tmpStr
    330.       Else
    331.          tmpStr = "1" + tmpStr
    332.       End If
    333.       Exit For
    334.    End If
    335.    iMask = iMask * 2
    336.    If iMask And Num Then
    337.       tmpStr = "1" + tmpStr
    338.    Else
    339.       tmpStr = "0" + tmpStr
    340.    End If
    341. Next
    342. Bin = tmpStr
    343. End Function
    复制代码
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    免责声明

    本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

    QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

    Copyright © 2001-2023 Discuz! Team. GMT+8, 2025-5-7 07:34 , File On Powered by Discuz! X3.49

    快速回复 返回顶部 返回列表