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

Da Gambas-it.org - Wikipedia.
 
(23 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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.
+
=Conversione rapida con i caratteri '''&x'''=
 +
Una modalità rapida, per effettuare la conversione dalla rappresentazione binaria in quella decimale, è di anteporre alla rappresentazione binaria i simboli '''&x''', come segue:
 +
Print &x11111110
 +
oppure, avendo la rappresentazione binaria in formato stringa, è di usare la funzione "Val()" e i predetti caratteri '''&x''':
 +
i = Val("&x11111110")
 +
 +
 
 +
=Conversione con il carattere '''%'''=
 +
Un'altra modalità prevede l'uso del carattere '''%''', anteponendolo alla rappresentazione binaria del valore da convertire:
 +
Print %11111110
 +
oppure, avendo la rappresentazione binaria in formato stringa, l'uso della funzione nativa "Val()" anteponendo alla stringa di caratteri della rappresentazione binaria il carattere '''%''':
 +
Print Val("%11111110")
 +
 
 +
 
 +
=Uso di appositi algoritmi=
 +
Si potranno anche utilizzare specifici algoritmi.
 +
 
 +
=Introduzione generale=
 +
In via generale, per convertire un numero, espresso in formato a rappresentazione binaria in quella 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:
 
Convertiamo, per esempio il numero binario 10101010:
Riga 9: Riga 27:
 
   
 
   
 
  =  <FONT color=#B22222>170</font>
 
  =  <FONT color=#B22222>170</font>
 
 
Mostriamo di seguito alcune modalità per ottenere la conversione di un numero da rappresentazione binaria in rappresentazione decimale.
 
  
 
==Uso delle sole risorse di gambas==
 
==Uso delle sole risorse di gambas==
Riga 19: Riga 34:
 
  '''Public''' Sub Main()   
 
  '''Public''' Sub Main()   
 
   
 
   
  Dim s As String   
+
  Dim s As String   
  Dim bb As Byte[]
+
  Dim bb As Byte[]
  Dim j As Byte
+
  Dim b As Byte
  Dim l As Long
+
  Dim l As Long
 
   
 
   
 
   s = "01011010010110100101101001011010"
 
   s = "01011010010110100101101001011010"
Riga 28: Riga 43:
 
   bb = Byte[].FromString(s).Reverse()
 
   bb = Byte[].FromString(s).Reverse()
 
   
 
   
   For j = 0 To bb.Max
+
   For b = 0 To bb.Max
     l += Val(Chr(bb[j])) * (2 ^ j)
+
     l += Clong((bb[b] - 48) * (2 ^ b))
 
   Next
 
   Next
 
   
 
   
Riga 39: Riga 54:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim binario As String
+
  Dim binario As String
  Dim decimale As Long
+
  Dim decimale As Long
  Dim pos As Byte
+
  Dim pos As Byte
 
    
 
    
 
   binario = "01011010010110100101101001011010"
 
   binario = "01011010010110100101101001011010"
 
      
 
      
 
   Repeat
 
   Repeat
     decimale += Val(Mid(binario, pos + 1, 1)) * (2 ^ pos)
+
     decimale += Mid(binario, Len(binario) - pos, 1) * (2 ^ pos)
 
     Inc pos
 
     Inc pos
   Until pos = Len(binario)
+
   Until pos == Len(binario)
 
      
 
      
 
   Print decimale
 
   Print decimale
Riga 54: Riga 69:
 
  '''End'''
 
  '''End'''
  
 +
==Uso della funzione esterna "strtol()"==
 +
La funzione ''strtol( )'', dichiarata nel file header "''/usr/include/stdlib.h''", converte un numero da rappresentazione stringa in un valore di tipo "''long int''", come definito nel file header "''/usr/include/limits.h''"
  
==Uso di un'apposita libreria condivisa esterna==
+
Dunque si passerà a detta funzione esterna una stringa contenente la rappresentazione binaria del valore da convertire, avendo cura di porre il terzo parametro della funzione medesima a 2 (base binaria).
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"
+
Mostriamo un semplice esempio:
 +
  Library "libc:6"
 
   
 
   
  <FONT Color=gray>' ''char * bindecstring(const char * binario)''
+
  <FONT Color=gray>' ''long int strtol (const char *__restrict __nptr, char **__restrict __endptr, int __base)''
  ' ''Converte un numero binario in numero in rappresentazione decimale di tipo Long.''</font>
+
  ' ''Convert a string to a long integer.''</font>
  Private Extern bindeclong(binario As String) As Long
+
  Private Extern strtol(__nptr As String, __endptr As Pointer, __base As Integer) As Long
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim bnr As String
+
  Dim binario As String
  Dim rit As Long
+
  Dim l As Long
 
    
 
    
   CreaSo()
+
<FONT Color=gray>' ''Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807''</font>
 +
   binario = "111111111111111111111111111111111111111111111111111111111111111"
 +
     
 +
  l = strtol(binario, 0, 2)
 
    
 
    
  <FONT Color=gray>' ''Il valore espresso in rappresentazione "binaria" da far convertire in rappresentazione decimale di tipo Long:''</font>
+
   Print l
  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'''
 +
 +
 +
 +
=Riferimenti=
 +
* https://cplusplus.com/reference/cstdlib/strtol/
 +
* https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm

Versione attuale delle 14:36, 15 ago 2022

Conversione rapida con i caratteri &x

Una modalità rapida, per effettuare la conversione dalla rappresentazione binaria in quella decimale, è di anteporre alla rappresentazione binaria i simboli &x, come segue:

Print &x11111110

oppure, avendo la rappresentazione binaria in formato stringa, è di usare la funzione "Val()" e i predetti caratteri &x:

i = Val("&x11111110")

Conversione con il carattere %

Un'altra modalità prevede l'uso del carattere %, anteponendolo alla rappresentazione binaria del valore da convertire:

Print %11111110

oppure, avendo la rappresentazione binaria in formato stringa, l'uso della funzione nativa "Val()" anteponendo alla stringa di caratteri della rappresentazione binaria il carattere %:

Print Val("%11111110")


Uso di appositi algoritmi

Si potranno anche utilizzare specifici algoritmi.

Introduzione generale

In via generale, per convertire un numero, espresso in formato a rappresentazione binaria in quella 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

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 b As Byte
  Dim l As Long

  s = "01011010010110100101101001011010"

  bb = Byte[].FromString(s).Reverse()

  For b = 0 To bb.Max
    l += Clong((bb[b] - 48) * (2 ^ b))
  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 += Mid(binario, Len(binario) - pos, 1) * (2 ^ pos)
    Inc pos
  Until pos == Len(binario)
   
  Print decimale
  
End

Uso della funzione esterna "strtol()"

La funzione strtol( ), dichiarata nel file header "/usr/include/stdlib.h", converte un numero da rappresentazione stringa in un valore di tipo "long int", come definito nel file header "/usr/include/limits.h"

Dunque si passerà a detta funzione esterna una stringa contenente la rappresentazione binaria del valore da convertire, avendo cura di porre il terzo parametro della funzione medesima a 2 (base binaria).

Mostriamo un semplice esempio:

Library "libc:6"

' long int strtol (const char *__restrict __nptr, char **__restrict __endptr, int __base)
' Convert a string to a long integer.
Private Extern strtol(__nptr As String, __endptr As Pointer, __base As Integer) As Long


Public Sub Main()
 
  Dim binario As String
  Dim l As Long
 
' Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807
  binario = "111111111111111111111111111111111111111111111111111111111111111"
      
  l = strtol(binario, 0, 2)
  
  Print l
  
End


Riferimenti