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

Da Gambas-it.org - Wikipedia.
Riga 21: Riga 21:
 
  '''Public''' Sub Main()   
 
  '''Public''' Sub Main()   
 
   
 
   
  Dim s As String   
+
  Dim s As String   
  Dim bb As Byte[]
+
  Dim bb As Byte[]
  Dim b As Byte
+
  Dim b As Byte
  Dim l As Long
+
  Dim l As Long
 
   
 
   
 
   s = "01011010010110100101101001011010"
 
   s = "01011010010110100101101001011010"
Riga 41: Riga 41:
 
  '''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"
Riga 50: Riga 50:
 
     decimale += CLong(Val(Mid(binario, Len(binario) - pos, 1)) * (2 ^ pos))
 
     decimale += CLong(Val(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 72: Riga 72:
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
  Dim binario As String
+
  Dim binario As String
  Dim l As Long
+
  Dim l As Long
 
    
 
    
 
  <FONT Color=gray>' ''Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807''</font>
 
  <FONT Color=gray>' ''Come esempio passiamo la rappresentazione binaria del valore massimo supportato dal tipo "Long" nativo di Gambas: 9223372036854775807''</font>

Versione delle 08:25, 12 ago 2022

Introduzione generale

In via generale, 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


Uso di appositi algoritmi

A tal fine si potranno utilizzare degli specifici algoritmi.

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 += CLong(Val(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 = "111111111111111111111111111111111111111111111111111111111111111111"
      
  l = strtol(binario, 0, 2)
  
  Print l
  
End