2013-12-04 9 views
0

У меня есть неэффективная функция VB6 для чтения целых чисел дополнения 2.Улучшение производительности чтения 2-х целых чисел

Private Function Mantis(ByVal HiByte As Byte, ByVal LoByte As Byte, ByVal Range As Single) As Single 

    Dim bSam As Integer 
    Dim Bits(15) As Boolean 

    bSam = (HiByte And &H7F) * &H100 Or LoByte Or (HiByte \ &H80) * &H8000 

    Bits(15) = bSam And 32768 

    If Bits(15) Then 
     If bSam = -32768 Then 
      bSam = 0 
     Else 
      bSam = bSam * -1 
     End If 
    End If 

    Dim I As Integer 

    For I = 0 To 14 
     Bits(I) = bSam And (2^I) 
    Next 

    Dim bOut As Long 

    If Bits(2) Then bOut = bOut + 5 
    If Bits(3) Then bOut = bOut + 10 
    If Bits(4) Then bOut = bOut + 20 
    If Bits(5) Then bOut = bOut + 39 
    If Bits(6) Then bOut = bOut + 78 
    If Bits(7) Then bOut = bOut + 156 
    If Bits(8) Then bOut = bOut + 313 
    If Bits(9) Then bOut = bOut + 625 
    If Bits(10) Then bOut = bOut + 1250 
    If Bits(11) Then bOut = bOut + 2500 
    If Bits(12) Then bOut = bOut + 5000 
    If Bits(13) Then bOut = bOut + 10000 
    If Bits(14) Then bOut = bOut + 20000 
    If Bits(15) Then bOut = bOut * -1 

    Mantis = bOut * Range 

End Function 

Как я могу улучшить его производительность? Я думаю, что его можно заменить на некоторые memcpy или другие вызовы API, но я не знаю, какой из них. Потому что сейчас он должен проверять каждый отдельный бит.

ответ

0

Тип целочисленного VB6 - это 16-разрядное дополнение, подписанное двумя, поэтому я не уверен, для чего требуется вся бит-бит.

Почему не что-то простое, как это, если данные поступают в виде двух значений байт:

Private Type IntAsBytes 
    LoByte As Byte 
    HiByte As Byte 
End Type 

Private Type IntAsInt 
    Int As Integer 
End Type 

Private Function Mantis(_ 
    ByVal HiByte As Byte, _ 
    ByVal LoByte As Byte, _ 
    ByVal Range As Single) As Single 

    Dim AsBytes As IntAsBytes 
    Dim AsInt As IntAsInt 

    AsBytes.LoByte = LoByte 
    AsBytes.HiByte = HiByte 
    LSet AsInt = AsBytes 
    Mantis = CSng(AsInt.Int) * Range 
End Function 
Смежные вопросы