Re: [VB6 ] 關於VB6位元左移問題

看板Visual_Basic作者 (矇面加菲獅)時間14年前 (2012/02/05 13:52), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串3/4 (看更多)
'左移 'Length 位元數量,預設給8bits(1bytes) Public Function ShiftL(ByVal Num As Long, _ Optional Length As Integer = 8) As Long Dim Max As Long Max = 2 ^ (Length - 1) '最高位元的10進位值 If Num >= Max Then '先減去最高位元 Num = Num - Max End If ShiftL = Num * 2 End Function '右移 Public Function ShiftR(ByVal Num As Long) As Long ShiftR = Fix(Num / 2) '除以2,取整數即可 End Function ※ 引述《yauhh (喲)》之銘言: : ※ 引述《sanlinchang (<---剩男)》之銘言: : : arry[i]/2 |= arry[i]-48 << 4 : : arry(i)\2 = (arry(i) or ((arry(i)-48)+16)) : ^ 應該是乘16 : VB6有錯誤處理機制,可以on error goto 指定的程式段落. : 左移運算可以這樣子做: : environ.bas : --------------------------- : Option Explicit : Public Function ShiftL(Num As Long) As Long : On Error GoTo handle_overflow : ShiftL = Num * 2 '絕大部分只要一個乘二即可,如果嫌乘法慢,可以寫Num+Num. : Exit Function : handle_overflow: : HandleOverflow Num : End Function : 'HandleOverflow Num 時,知道Num一定是二進位值為1xxxxxxxxx...x, : '這時候要看你要實作算術左移或是普通左移,或者是循環左移. : '以下做普通左移: : Private Function HandleOverflow(Num as Long) As Long : Dim bit_len As Integer : Dim temp As Long : Dim mask as Long : temp = Num : bit_len = 0 : While temp <> 1 : temp = temp \ 2 : bit_len = bit_len + 1 : Wend : '我需要&H7FFFF...F將Num含第二位元之後的值取出. : mask = CLng("&H7" & String((bit_len-3)/4, "F")) : HandleOverflow = (Num And mask) * 2 : End Function -- ▃▅▇▆▄ ▆▂▃ ` 逝去感如何能留住,半點遺留殊不易,██▅▇▄▃ ▇▃▂" . █████████▃i ▁▄▇ 更多悽悽慘慘的遭遇………██▆▃ █▅▆▃ˍ▄* ▂█▄▇▅▂. 我不知道,王~八~蛋~~! ▂▆███ █▄▃ 。fumizuki。Check。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.176.149.188

02/05 14:14, , 1F
是正確,但就是不要這樣做,每次左移都做那麼多動作.
02/05 14:14, 1F

02/05 14:15, , 2F
等最後溢位才來處理溢位,才比較省工
02/05 14:15, 2F

02/05 20:58, , 3F
請問移BYTE的目地是什麼呢?
02/05 20:58, 3F

02/05 23:06, , 4F
移位元很多地方用的到 例如:解BCD Code....
02/05 23:06, 4F

02/06 00:19, , 5F
跟游泳跑步的目的是一樣的。
02/06 00:19, 5F
文章代碼(AID): #1FBXasFv (Visual_Basic)
討論串 (同標題文章)
文章代碼(AID): #1FBXasFv (Visual_Basic)