Differenze tra le versioni di "Convertire un numero da Decimale in Binario"

Da Gambas-it.org - Wikipedia.
Riga 30: Riga 30:
  
  
o anche il seguente (per convertire tipi di valori non superiori a 32 bit):
+
o anche il seguente (per convertire tipi di valori <SPAN Style="text-decoration:underline">non</span> superiori a 32 bit):
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
Riga 38: Riga 38:
 
   i = 1257421
 
   i = 1257421
 
    
 
    
   For b = 0 To 31
+
   For b = 0 To (SizeOf(gb.Integer) * 8) - 1
 
     If i And (&80000000& \ CInt(2 ^ b)) Then
 
     If i And (&80000000& \ CInt(2 ^ b)) Then
 
       Print "1";
 
       Print "1";
Riga 47: Riga 47:
 
   Next
 
   Next
 
    
 
    
 +
'''End'''
 +
 +
 +
Per convertire un numero di tipo ''Long'' (64 bit) dovremo utilizzare un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.
 +
Library "/tmp/lib"
 +
 +
<FONT Color=gray>' ''char *decbin(long num)''
 +
' ''Converte un numero da rappresentazione decimale a rappresentazione binaria a 64 bit.''</font>
 +
Private Extern decbin(num As Long) As String
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim numero As Long
 +
  Dim s As String
 +
 
 +
  CreaSo()
 +
   
 +
  numero = 1234567890123456789
 +
 
 +
  s = decbin(numero)
 +
   
 +
  Print s
 +
 
 +
'''End'''
 +
 +
 +
'''Private''' Procedure CreaSo()
 +
 
 +
  File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n#include <limits.h>\n\n" &
 +
            "const unsigned long int PARAGONE = 9223372036854775808UL;\n" &
 +
            "char *decbin(long num) {\n\n" &
 +
            "  char *stringa = calloc(65, sizeof(char));\n\n\n" &
 +
            "  char n;\n\n" &
 +
            "  for (n=0; n<64; n++)\n" &
 +
            "      stringa[n] = num & (PARAGONE >> n) ? '1' : '0';\n\n" &
 +
            "  return stringa;\n\n}")
 +
 
 +
  Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 +
 
 
  '''End'''
 
  '''End'''
  

Versione delle 19:25, 7 apr 2017

Per convertire un numero da Decimale in rappresentazione binaria, sono possibili almeno tre modalità.


Uso della funzione Bin() di Gambas

Come è noto, si può far uso agevolmente dell'apposita funzione Bin().


Uso di apposito algoritmo

Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:

Public Sub Main()

 Dim i As Integer
 Dim bb As New Byte[]
 Dim b As Byte
 
  i = 123456789
 
  While i > 0
    bb.Add(CByte(i Mod 2))
    i \= 2
  Wend

  bb.Reverse
  
  For b = 0 To bb.Max
    Print bb[b];
  Next
    
End


o anche il seguente (per convertire tipi di valori non superiori a 32 bit):

Public Sub Main()
 
 Dim b As Byte
 Dim i As Integer
 
  i = 1257421
  
  For b = 0 To (SizeOf(gb.Integer) * 8) - 1
    If i And (&80000000& \ CInt(2 ^ b)) Then
      Print "1";
    Else
      Print "0";
    Endif
      
  Next
  
End


Per convertire un numero di tipo Long (64 bit) dovremo utilizzare un'apposita funzione da noi scritta in linguaggio C ed inserita in una libreria dinamica condivisa .so esterna.

Library "/tmp/lib"

' char *decbin(long num)
' Converte un numero da rappresentazione decimale a rappresentazione binaria a 64 bit.
Private Extern decbin(num As Long) As String


Public Sub Main()
 
 Dim numero As Long
 Dim s As String
 
  CreaSo()
   
  numero = 1234567890123456789
 
  s = decbin(numero)
   
  Print s
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/lib.c", "#include <stdlib.h>\n\n#include <limits.h>\n\n" &
           "const unsigned long int PARAGONE = 9223372036854775808UL;\n" &
           "char *decbin(long num) {\n\n" &
           "   char *stringa = calloc(65, sizeof(char));\n\n\n" &
           "   char n;\n\n" &
           "   for (n=0; n<64; n++)\n" &
           "       stringa[n] = num & (PARAGONE >> n) ? '1' : '0';\n\n" &
           "   return stringa;\n\n}")
 
 Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
End


Uso della funzione esterna SDL_ltoa() del API di SDL2

E' inoltre possibile far uso della funzione esterna ltoa() del API di SDL2.

In tal caso sarà necessario installare nel sistema e richiamare nell'applicazione Gambas la libreria dinamica e condivisa: "libSDL2-2.0.so.0.2.0"


Mostriamo un semplice esempio:

Library "libSDL2-2.0:0.2.0"

' char * SDL_ltoa(long value, char * string, int radix)
Private Extern SDL_ltoa(value As Integer, strP As Pointer, radix As Integer)


Public Sub Main()

 Dim p As Pointer
 
  p = Alloc(64)
  
  SDL_ltoa(123456789, p, 2)
  
  Print String@(p)
  
  Free(p)

End


Riferimenti

https://fossies.org/dox/SDL2-2.0.3/SDL__string_8c.html