Convertire un numero da rappresentazione binaria in decimale
Per convertire un numero, espresso in formato a rappresentazione binaria, nella corrispondente rappresentazione decimale, bisogna moltiplicare le cifre del numero binario per le potenze decrescenti di 2, e successivamente sommare i risultati.
Convertiamo, per esempio il numero binario 10101010:
(1 * 27) + (0 * 26) + (1 * 25) + (0 * 24) + (1 * 23) + (0 * 22) + (1 * 21) + (0 * 20) = = (1 * 128) + (0 * 64) + (1 * 32) + (0 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (0 * 1) = = 128 + 0 + 32 + 0 + 8 + 0 + 2 + 0 = = 170
Mostriamo di seguito alcune modalità per ottenere la conversione di un numero da rappresentazione binaria in rappresentazione decimale.
Indice
Uso delle sole risorse di gambas
Con l'uso delle sole risorse di Gambas possiamo adottare almeno un paio di modalità.
1a modalità
Public Sub Main() Dim s As String Dim bb As Byte[] Dim j As Byte Dim l As Long s = "01011010010110100101101001011010" bb = Byte[].FromString(s).Reverse() For j = 0 To bb.Max l += Val(Chr(bb[j])) * (2 ^ j) Next Print "Il corrispondente valore decimale è: "; l End
2a modalità
Public Sub Main() Dim binario As String Dim decimale As Long Dim pos As Byte binario = "01011010010110100101101001011010" Repeat decimale += Val(Mid(binario, pos + 1, 1)) * (2 ^ pos) Inc pos Until pos = Len(binario) Print decimale End
Uso di un'apposita libreria condivisa esterna
Possiamo utilizzare anche un'apposita funzione esterna sritta in C, contenuta da una libreria dinamica condivisa .so scritta da noi, che faccia perno in particolare sulla funzione esterna "strtol( )" per convertire il valore di tipo stringa che rappresenta il numero binario in rappresentazione decimale di tipo Long.
Library "/tmp/lib" ' char * bindecstring(const char * binario) ' Converte un numero binario in numero in rappresentazione decimale di tipo Long. Private Extern bindeclong(binario As String) As Long Public Sub Main() Dim bnr As String Dim rit As Long CreaSo() ' Il valore espresso in rappresentazione "binaria" da far convertire in rappresentazione decimale di tipo Long: bnr = "111111111111111111111111111111111111111111111111111111111111111" rit = bindeclong(bnr) Print rit End Private Procedure CreaSo() File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n" & "signed long int bindeclong(const char * binario) {\n\n" & " signed long int ris;\n" " ris = strtol(binario, NULL, 2);\n" & " return ris;\n\n}") Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait End