Newsgroup: it.comp.lang.visual-basic
Titolo: Shift

Come si fa simulare uno shift come quelli previsti in C (operatori >> e <<)?


Se non sbaglio l'operatore > esegue lo shift a destra di un bit e >>
di 8 bit (analogamente < e << a sinistra).
Questo effetto si puo' emulare con divisioni (right) o moltiplicazioni
(left) per 2 e 2^8... ovviamente per interi.
Se ho detto una castroneria, chiedo pieta'... ;-)
Jojo

 Se ho detto una castroneria, chiedo pieta'... ;-)
Qualcuna l'hai detta  :-)))
l'operatore >> si usa cosi':   A = b >> c
ossia prendo b lo traslo a destra di c bits (c posizioni) e lo assegno ad A.
E poi le divisioni e moltiplicazioni funzionano solo se non hai MAI a che fare
con l'ultimo bit (quello del segno), inquanto ti manda tutto a put..ne.
Come fare dunque?
Il modo c'e', ma occorre scrivere funzioni che sono tutt'altro che veloci.
Beccati queste, non e' stato semplice, ma era una questione d'orgoglio.  :-)))
'****************************************************************************
Private Sub Form_Load()
    Dim cont%
    Dim TestSx  As Long
    Dim TestDx  As Long
    Dim S1$, S2$
 
    TestSx = &H87654321
    TestDx = &H87654321
 
    Debug.Print "00: Sx=" & Right$("00000000" & Hex(TestSx), 8);
    Debug.Print "  Dx=" & Right$("00000000" & Hex(TestDx), 8)
    For cont = 1 To 31
        TestSx = ShiftSx(TestSx, 1)
        TestDx = ShiftDx(TestDx, 1)
        Debug.Print Format$(cont, "00") & ": Sx=" & Right$("00000000" & Hex(TestSx), 8);
        Debug.Print "  Dx=" & Right$("00000000" & Hex(TestDx), 8)
    Next cont
End Sub
Function ShiftSx(ByVal valore As Long, Bits As Integer) As Long
    Dim NuovoValoreHex$
    Dim cont        As Integer
    Dim Maschera    As Long
    Dim Nibble      As Integer
    Dim ContNibble  As Integer
    Maschera = &H1
    NuovoValoreHex$ = ""
    ContNibble = 2 ^ (Bits Mod 4)
    Nibble = 0
    For cont = 0 To 31 - Bits
        If (valore And Maschera) <> 0 Then
            Nibble = Nibble Or ContNibble
        End If
        ContNibble = ContNibble * 2
        If ContNibble > 8 Then
            NuovoValoreHex$ = Hex(Nibble) & NuovoValoreHex$
            ContNibble = 1
            Nibble = 0
        End If
        If Maschera <> &H40000000 Then
            Maschera = Maschera * 2
        Else
            Maschera = &H80000000
        End If
    Next cont
    If ContNibble <> 1 Then NuovoValoreHex$ = Hex(Nibble) & NuovoValoreHex$
    ShiftSx = Val("&H" & Left$(NuovoValoreHex$ & "00000000", 8) & "&")
 
End Function
Function ShiftDx(ByVal valore As Long, Bits As Integer) As Long
    Dim NuovoValoreHex$
    Dim cont        As Integer
    Dim Maschera    As Long
    Dim Nibble      As Integer
    Dim ContNibble  As Integer
    Maschera = &H80000000
    NuovoValoreHex$ = ""
    ContNibble = 2 ^ (3 - (Bits Mod 4))
    Nibble = 0
    For cont = 0 To 31 - Bits
        If (valore And Maschera) <> 0 Then
            Nibble = Nibble Or ContNibble
        End If
        ContNibble = ContNibble / 2
        If ContNibble = 0 Then
            NuovoValoreHex$ = NuovoValoreHex$ & Hex(Nibble)
            ContNibble = 8
            Nibble = 0
        End If
        If cont Then
            Maschera = Maschera / 2
        Else
            Maschera = &H40000000
        End If
    Next cont
    If ContNibble <> 8 Then NuovoValoreHex$ = NuovoValoreHex$ & Hex(Nibble)
    ShiftDx = Val("&H" & NuovoValoreHex$ & "&")
End Function
'****************************************************************************
-- 
Hi, Ciao
Ettore                 By -MES-
http://www.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb