VB中位操作运算函数【移位指令】

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

猜你在找的VB相关文章