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.
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