Convertire un numero da rappresentazione binaria in decimale

Da Gambas-it.org - Wikipedia.

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