作者fumizuki (矇面加菲獅)
看板Visual_Basic
標題Re: [VB6 ] 關於VB6位元左移問題
時間Sun Feb 5 13:52:51 2012
'左移
'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
推 yauhh:是正確,但就是不要這樣做,每次左移都做那麼多動作. 02/05 14:14
→ yauhh:等最後溢位才來處理溢位,才比較省工 02/05 14:15
→ chinoyan:請問移BYTE的目地是什麼呢? 02/05 20:58
推 Marty:移位元很多地方用的到 例如:解BCD Code.... 02/05 23:06
→ MOONRAKER:跟游泳跑步的目的是一樣的。 02/06 00:19