Differenze tra le versioni di "Convertire un numero da rappresentazione binaria in decimale"

Da Gambas-it.org - Wikipedia.
Riga 11: Riga 11:
  
  
Mostriamo un paio di modalità per ottenere la conversione in Gambas di un numero da rappresentazione binaria in decimale.
+
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à.
  
 
===1<SUP>a</sup> modalità===  
 
===1<SUP>a</sup> modalità===  
Riga 32: Riga 35:
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
 
===2<SUP>a</sup> modalità===  
 
===2<SUP>a</sup> modalità===  
Riga 49: Riga 51:
 
      
 
      
 
   Print decimale
 
   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"
 +
 +
<FONT Color=gray>' ''char * bindecstring(const char * binario)''
 +
' ''Converte un numero binario in numero in rappresentazione decimale di tipo Long.''</font>
 +
Private Extern bindeclong(binario As String) As Long
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim bnr As String
 +
  Dim rit As Long
 +
 
 +
  CreaSo()
 +
 
 +
  <FONT Color=gray>' ''Il valore espresso in rappresentazione "binaria" da far convertire in rappresentazione decimale di tipo Long:''</font>
 +
  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'''
 
  '''End'''

Versione delle 19:08, 10 mag 2017

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