Newsgroup: it.comp.lang.visual-basic
Titolo: Trasformare numero decimale in binario

Dato un numero intero N in base decimale, quali sono le istruzioni per
trasformarlo in binario.
Se è possibile, usate istruzioni comprensibili a programmatori con
esperienza minima. Grazie.

Function Base_10(ByVal x, ByVal y) As Variant
'********************************************************************
'* x        Stringa da convertire in decimale                       *
'* y        Base di partenza                                        *
'* Base_10  Ritorna un Variant che corrisponde al valore            *
'*          decimale convertito di x                                *
'********************************************************************
  Dim i, j, k, valore, h, stringa, cif(48 To 90), cifra
  stringa = x
  k = Len(x)
  j = 0
  For i = 48 To 90
    If i < 58 Or i > 64 Then
      cif(i) = j
      j = j + 1
    End If
  Next
  j = 0
  For i = k To 1 Step -1
    cifra = cif(Asc(Mid$(stringa, i, 1)))
    valore = valore + (y ^ j * cifra)
    j = j + 1
  Next
  Base_10 = valore
End Function
bye
PS l'ho trovata con una ricerca di 5 secondi su google.... possibile che non
cercate prima lě?
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
www.nicolaottomano.it

 cercate prima lě?
E prima ancora cercate sul sito comune :)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 che non cercate prima lě?
Ed io in 10 secondi ho trovato proprio quello che voleva Antonio ;) :
'Decimal To Binary
' =================
' NOTE: You can limit the size of the returned
'              answer by specifying the number of bits
Function Dec2Bin(ByVal DecimalIn As Variant, _
              Optional NumberOfBits As Variant) As String
    Dec2Bin = ""
    DecimalIn = Int(CDec(DecimalIn))
    Do While DecimalIn <> 0
        Dec2Bin = Format$(DecimalIn - 2 * Int(DecimalIn / 2)) & Dec2Bin
        DecimalIn = Int(DecimalIn / 2)
    Loop
    If Not IsMissing(NumberOfBits) Then
       If Len(Dec2Bin) > NumberOfBits Then
          Dec2Bin = "Error - Number exceeds specified bit size"
       Else
          Dec2Bin = Right$(String$(NumberOfBits, _
                    "0") & Dec2Bin, NumberOfBits)
       End If
    End If
End Function
-- 
Esteban
www.seber.it
Questo post č stato scritto con bit riciclati.

 Ed io in 10 secondi ho trovato proprio quello che voleva Antonio ;) :
Ma state scherzando, vero?
    b = ""
    For nb = 0 To 9
        b = IIf((123 And 2 ^ nb), "1", "0") & b
    Next nb

    Next nb
Io ci ho messo 10 minuti.
Onestamente non so come faccia a girare :)
Function long2Bin(a As Long, Optional r As String = "") As String
If a = 0 Then Exit Function 
long2Bin = long2Bin(a \ 2, long2Bin) & a Mod 2 & r
End Function
se VB non si ostinasse a valutare entrambi i casi di un costrutto iif, pur
sapendo che ne deve esguire uno solo, potrei far stare la funzione su una sola
riga :)
termoPilucco

 funzione su una sola riga :)
Con tutte (le necessarie) ricorsioni? E'/sarebbe una riga per modo di
dire...

 End Function
Intanto complimenti a te e a Lupo per le soluzioni.
Ma secondo te, se uno passa 0 come parametro, il risultato non dovrebbe
essere "0"?
Perché quel 'If a = 0 Then Exit Function'?


 Perché quel 'If a = 0 Then Exit Function'?
Prova a toglierlo e chiamaci quando finisce... (è ricorsiva)

dire...
Beh, intendevo una riga di codice scritto. Chiaro che una routine che crea una
stringa in ogni caso deve farlo carattere per carattere.
Cmq il caso 0 mi frega... tocca aggiungere una nuova riga.
termoPilucco

 Prova a toglierlo e chiamaci quando finisce... (è ricorsiva)
beh... allora finisce molto alla svelta per esaurimento dello stack :-)
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 Prova a toglierlo e chiamaci quando finisce... (è ricorsiva)
Ecco ecco... ho scoperto cosa non mi convinceva della mia prima versione: il
parametro stringa 'r' non serve a nulla :)
Versione riveduta e corretta con gestione degli zeri prima del numero e del
caso base:
Function long2Bin(a As Long) As String
If a = 0 Then long2Bin = String(32, "0"): Exit Function
long2Bin = Right(String(32, "0") & long2Bin(a \ 2) & a Mod 2, 32)
End Function
termoPilucco


E allora mi permetto di aggiungere un parametro che indichi il numero di bit
da visualizzare e di togliere quel Exit Function che proprio non mi piace:
Function long2Bin(a As Long, n As Long) As String
    If a <> 0 Then
        long2Bin = Right(String(n, "0") & long2Bin(a \ 2, n) & a Mod 2, n)
    Else
        long2Bin = String(n, "0")
    End If
End Function
Comunque grazie termoPilucco per la soluzione. Non avevo io il problema,
almeno non adesso, però la funzione che ho trovato io con Google è ben più
complessa e il risultato è uguale.
Ciao!
-- 
Esteban
www.seber.it
Questo post è stato scritto con bit riciclati.

 piů complessa e il risultato č uguale.
Quella che avevi trovato in giro funziona meglio, perchč gestisce anche
numeri superiori a 2^31 e lo fa nel modo piů economico (si puo usare
l'operatore "mod" o "\" solo sui tipi interi).
Il mio era solo un tentativo (non riuscito) di scriverla in una sola riga.
Perň, se ti interessa, tempo fa, ne ho scritta una che gestiva sia numeri
grandi che numeri con la virgola.
Prova per esempio a vedere la rappresentazione binaria di un numero
innocente come "0.2" capirai perchč utilizzando i numeri in virgola mobile
si "sbagliano" i calcoli piů elementari.
Function binrap(n As Double) As String
Dim n1 As Double
n1 = Int(n)
If n1 >= 1 Then
    While n1 >= 1
        If Int(n1 / 2) * 2 <> n1 Then
            binrap = "1" & binrap
            n1 = (n1 - 1) / 2
        Else
            binrap = "0" & binrap
            n1 = n1 / 2
        End If
    Wend
Else
    binrap = "0"
End If
n = n - Int(n)
n1 = 1 / 2
If n <> 0 Then
    binrap = binrap & "."
    While n <> 0
        If n - n1 > 0 Then
            binrap = binrap & "1"
            n = n - n1
        ElseIf n - n1 < 0 Then
            binrap = binrap & "0"
        Else
            binrap = binrap & "1"
            n = 0
            Exit Function
        End If
        n1 = n1 / 2
    Wend
End If
End Function
termoPilucco