Convertire un numero da Decimale in Binario
Per convertire un numero da Decimale in rappresentazione binaria, sono possibili alcune modalità.
Indice
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 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 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, 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" ' char *decbin(long num) ' Converte un numero da rappresentazione decimale a rappresentazione binaria a 64 bit. Private Extern decbin(num As Long) As String ' void free (void *__ptr) ' Free a block allocated by `malloc', `realloc' or `calloc'. 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 ' Libera l'area di memoria precedentemente allocata nel codice scritto in C: 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
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.18.2 ".
Mostriamo un semplice esempio:
Library "libSDL2-2.0:0.18.2" ' 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