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

Da Gambas-it.org - Wikipedia.
Riga 15: Riga 15:
 
   Print Base(1000, 2)
 
   Print Base(1000, 2)
 
   
 
   
End
 
 
 
==Uso di apposito algoritmo==
 
Volendo, è ovviamente possibile raggiungere il medesimo risultato con apposito codice, come ad esempio il seguente:
 
Public Sub Main()
 
 
  Dim l As Long
 
  Dim bb As New Byte[]
 
  Dim b As Byte
 
 
 
  l = 9223372036854775807
 
 
 
  for b = 0 To (SizeOf(gb.Long) * 8) - 1
 
    bb.Add(CByte(l Mod 2))
 
    l \= 2
 
  Next
 
 
  bb.Reverse
 
 
 
  For b = 0 To bb.Max
 
    Print bb[b];
 
  Next
 
   
 
End
 
o anche il seguente (per convertire tipi di valori <SPAN Style="text-decoration:underline">non</span> 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'', o comunque di un tipo di dimensione fino a 64 bit (quindi dal ''Byte'' fino al ''Long''), possiamo utilizzare - oltre al primo esempio già visto sopra - anche 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
 
 
<FONT Color=gray>' ''void free (void *__ptr)''
 
' ''Free a block allocated by `malloc', `realloc' or `calloc'.''</font>
 
Private Extern free_C(__ptr As Pointer) In "libc:6" Exec "free"
 
 
 
Public Sub Main()
 
 
 
  Dim numero As Long
 
  Dim s As String
 
 
 
  CreaSo()
 
   
 
  numero = 1234567890123456789
 
 
 
  s = decbin(numero)
 
   
 
  Print s
 
 
 
<FONT Color=gray>' ''Libera l'area di memoria precedentemente allocata nel codice scritto in C:''</font>
 
  free_C(VarPtr(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
  
Riga 110: Riga 21:
 
E' inoltre possibile far uso della funzione esterna "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.18.2'' ".
+
In tal caso sarà necessario installare nel sistema e richiamare nell'applicazione Gambas la libreria dinamica e condivisa: "''libSDL2-2.0.so.0.3000.7'' ".
  
  

Versione delle 01:28, 31 ott 2024

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

Uso della funzione "Bin()"

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

Public Sub Main()

 Print Bin(1000, 16)

End


Uso della funzione "Base()"

Si può far uso anche della funzione "Base()", la quale restituisce la rappresentazione stringa di un numero in base definita nel 2° parametro, che deve essere un numero compreso fra 2 e 36.

Public Sub Main()

 Print Base(1000, 2)

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.3000.7 ".


Mostriamo un semplice esempio:

Library "libSDL2-2.0:0.3000.7"

' 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