Da numero a binario



  • Da numero a binario
    di marinoernestoch (utente non iscritto) data: 26/11/2013 11:10:37

    Buon giorno.
    Ho tre quesiti: questo è il primo.
    Premessa, anche se per qualcuno è superfluo:
    Alla base delle elaborazioni dei computer, c'è l'informazione binaria: sono 8 bit, pari ad un Byte che assume una serie di valori in funzione dell'ON o dell'OFF dei singoli bit: da 0 a 255. Infine il valore di un Byte parte da destra verso sinistra: il primo bit se in ON vale 1, il secondo vale 2, il terzo vale 4, poi 8, 16, 32, 64 ed infine l'ultimo bit a sinistra se in ON vale 128.
    Non volevo tediare nessuno: ho dato queste informazioni solo per capire meglio la logica applicata in una macro.
    Le istruzioni:
    Dato un valore richiesto (che può essere da 0 a 63),espresso nel campo "Richiesta", accendo una serie di valori boleani, contenuti in una array, chiamata binario. Per praticità, non lavoro da destra a sinistra, ma da sinistra a destra. Mi sono sufficienti 6 valori: 1,2,3,4,5,6. L'elemento 0 dell'array, per praticità lo ignoro; L'ultimo valore acceso (il 6) corrisponde al valore del campo Richiesta pari a 32.
    Le istruzioni sotto funzionano perfettamente: quello che volevo sapere è se già esiste una funzione che faccia questo lavoro, o comunque una serie di istruzioni più semplici.
    Ringrazio
     
    Dim binario(6) As Boolean
    Dim indice, contatore, partenza As Integer
    contatore = 32
    partenza = Range("richiesta").Value
    
    '   primo passo trasformo il valore inserito (max 63= tutto acceso) e accendo i rispettivi
    '   valori boleani, secondo la codifica binaria:
    '   1 = 1;  2 = 2;  3 = 4; 4 =8; 5 = 16; 6 = 32
    ' es. valore inserito è 3, allora accendo 1 e 2 perchè 1+2 fa 3
    ' es. valore inserito è 8, alla accendo 4 perchè corrisponde all'8
    ' es. valore inserito è 15, allora accendo 4,3, 2, 1 perchè 8 +4 +2+1 = 15
        For indice = 6 To 1 Step -1
            If partenza >= contatore Then
                binario(indice) = True
                partenza = partenza - contatore
            End If
            If partenza = 0 Then Exit For     ' sono arrivato prima alla fine
            contatore = contatore / 2        '  contatore è potenza di 2
        Next indice



  • di Vecchio Frac data: 26/11/2013 11:19:23

    cit. "Non volevo tediare nessuno"
    ---> Un ripasso di questo tipo è sempre utile anche a chi pensa di saperle :)
    Ho capito tutto il senso del tuo discorso.
    Ti dico subito che non esiste una funzione incorporata che faccia quello che hai già (ben) fatto.
    Esistono magari implementazioni diverse (io stesso ne ho qualcuna da qualche parte, adesso la recupero anche solo per curiosità).





  • di Vecchio Frac data: 26/11/2013 11:30:31

    Ecco qui ho trovato le funzioni di conversione.

    La prima funzione (DecToBin) si occupa di convertire un numero in sistema decimale in una stringa che rappresenta un binario, e si può specificare il numero di bit da restituire.
    Esempio: DecToBin(53, 6) ---> "110101"
    Dove (ed è quello che serve a te) il bit a sinistra è quello più significativo (e vale 32, il secondo vale 16 eccetera).
    per cui puoi scandire carattere per carattere la stringa di ritorno e "accendere" i led che ti interessano per simulare il formato binario. Oppure come dici tu, "accendo una serie di valori booleani", assegni ad ogni elemento del vettore di destinazione il valore di ogni singolo carattere della stringa ottenuta.
    Come furbata finale, non ti dovrebbe essere difficile modificare la funzione per restituire qualcosa tipo "1-1-0-1-0-1" e quindi risparmiarti anche la fatica di scandire con For il risultato finale, bastandoti un bel arr = Split(stringa, "-") per avere nell'array "arr" tutti gli elementi della stringa binaria già pronti all'uso.

    La seconda (BinToDec) non ti interessa ma può essere comunque utile. Converte un numero binario in sistema decimale (il numero binario passato è naturalmente sottoforma di stringa).
    Esempio: BinToDec("1101") ---> 13


     
    'converte un numero decimale nel corrispondente binario 
    Function DecToBin(num As Long, size As Integer) As String
      Dim i As Long, bin As String
      For i = 0 To size - 1
        bin = IIf(num And 2 ^ i, "1", "0") + bin
      Next
      DecToBin = bin
    End Function
    
    'converte un numero binario (stringa) nel corrispondente decimale
    Function BinToDec(bin As String) As Long
      Dim total As Long, power As Long, i As Long
      power = Len(bin) - 1
      For i = 1 To Len(bin)
        If Mid(bin, i, 1) = "1" Then total = total + 2 ^ power
        power = power - 1
      Next
      BinToDec = total
    End Function






  • di Vecchio Frac data: 26/11/2013 11:36:45

    Scusate, nella foga della spiegazione ho omesso la mia fonte (risale a qualche anno fa a dire il vero, ma il merito di avermi fatto ragionare allora è tutto suo, un mio vecchio amico e Maestro, nonchè attuale MVP): Diego Cattaruzza. Si merita pure il grassetto ^_^





  • di marinoernestoch data: 26/11/2013 11:44:16

    Una parole x tutte:
    Complimenti



  • di marinoernestoch data: 26/11/2013 11:47:13

    xchè sotto il titolo appare "non iscritto", a fianco del mio nik, mentre a destra appare "utente".
    Nel rispondere, ero già loggato!



  • di Grograman (utente non iscritto) data: 26/11/2013 11:55:51

    Senza nulla togliere alle funzioni proposte, che anzi stimolano a effettuare un minimo di attività cerebrale, ci sono già quelle native di Excel:
     
    BINARIO.DECIMALE()
    DECIMALE.BINARIO()



  • di Vecchio Frac data: 26/11/2013 11:57:17

    Adesso infatti compari come "Utente" (iscritto, se non è specificato diversamente).
    Probabilmente quando hai aperto la discussione non eri iscritto, quindi rimane tale :) Nessun problema comunque.





  • di Vecchio Frac data: 26/11/2013 11:59:03

    @Grò
    Ottima osservazione.
    Le mie funzioni le avevo realizzate principalmente per i miei lavori in Access e non ho fatto caso alle funzioni native di Excel.
    Grazie mille per questo intervento (ps quindi si possono usare, in notazione parentesi quadra o con Evaluate e sintassi inglese, anche nel codice VBA).





  • di Grograman (utente non iscritto) data: 26/11/2013 12:21:18

    O yeah! non ci avevo pensato, ma già che ci siamo :
     
    ?Application.WorksheetFunction.Bin2Dec("1001")
    9
    ?Application.WorksheetFunction.Dec2Bin("9")
    1001
    



  • di marinoernestoch data: 26/11/2013 12:30:19