Newsgroup: it.comp.lang.visual-basic
Titolo: Conversione da decimale ad esadecimale e scorrimento bit

Ciao a tutti.
Ho un paio di  quesiti interessanti (credo):
1) Come posso convertire un numero decimale (mooolto lungo -> da 16 cifre in
su) in esadecimale? La funzione Hex regge fino a 10 cifre circa!!
2) Esiste una funzione di scorrimento bit (simile a << o >> in C) per
ovviare alla moltiplicazione (*) o alla divisione (\) per potenze di due?
Grazie per le risposte.
Marco R.

ovviare alla moltiplicazione (*) o alla divisione (\) per potenze di due?
Purtroppo no.
hth, hal
p.s.
Nota: ho provato con il numero 1234567890123456 (e' un 64 bit che sta in un Double
e in un Decimal (sottotipo di Variant), ma da' overflow in un Currency.
Quello che non capisco, e' che se scrivo lo stesso numero nella calcolatrice
di windows, ed eseguo la conversione in hex, ottengo un esadecimale diverso
da quello che ottengo con vb.
Dove sbaglio ? 
========================================================
'  -----------------------
'  Prove fatte per ottenere la rappresentazione esadecimale di un numero
'  a 64 bit (a dire la verita' non sono molto convinto: attendo volentieri
' pareri anche contrari.)
'
' Ho scritto il seguente codice in un .bas e l' ho eseguito dalla finestra
' di verifica.
'
' ------------------------
Option Explicit
Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" ( _
                    Destination As Any, Source As Any, ByVal Length As Long)
Private Type tagQWORD
    loDWord As Long
    hiDWord As Long
End Type
Private Type tagDouble
    dblValue As Double
End Type
' funzione che usa l' api
Public Function apiQWord2Hex(ByVal a_QWord As Double) As String
    Dim qword As tagQWORD
    memcpy qword, a_QWord, Len(qword)
    apiQWord2Hex = Format$(Hex$(qword.hiDWord), "00000000") & _
                Format$(Hex$(qword.loDWord), "00000000")
 
End Function
' funzione che usa il solo vb
Public Function vbQWord2Hex(ByVal a_QWord As Double) As String
    Dim qword As tagQWORD
    Dim dbl As tagDouble
    dbl.dblValue = a_QWord
    LSet qword = dbl
    vbQWord2Hex = Format$(Hex$(qword.hiDWord), "00000000") & _
                Format$(Hex$(qword.loDWord), "00000000")
 
End Function
' test che salva il valore a 64 bit in un file, da leggere poi con un editor esadecimale
' per verificare se il testo visualizzato e' lo stesso della QWord2Hex (naturalmente
' word saranno invertite :)
Public Sub Save2File(ByVal a_QWord As Double)
    Open "I:\Prova" For Binary As #1
    Put #1, , a_QWord
    Close #1
End Sub

 End Function
[...]

E cmq. la high word senza uno shift č totalmente diversa.
Accidenti, hai proprio ragione ( ---> specifiche IEEE 754)
Ho pensato, allora di risolverlo in quest' altro modo.
Non sara' il massimo, ma, sfruttando il sottotipo Decimal del Variant
riesce a manipolare numeri grandi fino a 
79,228,162,514,264,337,593,543,950,335 (non male, eh ?)
evitando gli insidiosi bug della virgola mobile.
Il codice e' sotto la firma.
(e il risultato e' uguale alla calcolatrice di windows :)
hth, hal
============================================
Public Function GetHex(ByVal a_BigNumber As String) As String
 
    Dim mi_Num As Variant
    Dim mi_Div As Variant
 
    '// converte nel sottotipo Decimal
    mi_Num = CDec(a_BigNumber)
    mi_Div = CDec(0)
 
    Do
        mi_Div = (mi_Num / 16)
 
        '// previene l' overflow nell' uso di Mod (funziona solo con i Long)
        If (mi_Num > &H7FFFFFFF) Then
            GetHex = Hex$((mi_Div - Int(mi_Div)) * 16) & GetHex
        Else
            GetHex = Hex$(mi_Num Mod 16) & GetHex
        End If
        mi_Num = Int(mi_Div)
    Loop While mi_Num > 0
 
End Function    '// GetHex