Bene facesti a segnalarmi quella pagina, la quale contiene una soluzione in fin efficace, ma che fa uso della funzione Bin( ) e di una funzione sulle Stringhe Mid( ) .
La soluzione funziona, ma.... non mi piace.
Io avrei un altro modo, più elegante e veloce, ma voglio prima sbirciare sui vostri. :devil:
Ad ogni modo mostraci la tua soluzione con la funzione Mod, che opera sui valori numerici interi.
Comunicazione integrativa:
Ogni soluzione aggiuntiva funzionante sarà inserita in quella pagina della nostra WIKI con citazione dell'autore.
Pensavo a qualcosa del genere:
Public Sub Main()
Dim n, b, c As Integer
n = 165
Print "La rappresentazione binaria di "; n; " è ";
While n > 0
b = n Mod 2
Print b;
If b <> 0 Then Inc c
n = n \ 2
Wend
Print " e contiene "; c; " bit a uno"
End
:ciao:
Ecco la mia soluzione:
Public Sub Form_Open()
Dim numero, i, bitauno As Byte
numero = 165
For i = 0 To 7
If BTst(numero, i) = True Then Inc bitauno
Next
Print "Il numero di bit a uno è: "; bitauno
End
Ottimo e rapido :D ma completandolo così per rimanere in scia al mio (integer) mi sono accorto di questa differenza e mi domando, c'è un errore nel mio codice?
Ad esempio con il numero 23750 il mio da "La rappresentazione binaria di 23750 è 011000110011101 e contiene 8 bit a uno"
Mentre la funzione bin da "La rappresentazione binaria di 23750 è 101110011000110 e contiene 8 bit a uno"
Vale a dire il primo zero scivola in fondo. Centra qualcosa la faccenda degli indiani? :hatecomputer:
Public Sub Main()
Dim numero, i, bitauno As Integer
numero = 23750
For i = 0 To 31
If BTst(numero, i) = True Then Inc bitauno
Next
Print "La rappresentazione binaria di "; numero; " è "; Bin(numero); " e contiene "; bitauno; " bit a uno";
End
Vale a dire il primo zero scivola in fondo. Centra qualcosa la faccenda degli indiani?
...gli indiani ti fanno lo scherzetto di ruotare il valore scritto in bit. :D
Prova a leggere il tuo risultato da destra verso sinistra....
Ehhhhhh! :donkey: finalmente ho capito :hard:
Purtroppo la distrazione mi ha giocato un brutto scherzo, ma non solo anche il fatto che 165 in binario è uguale in tutti e due i sensi di lettura e io mi sono fidato di questo risultato.
Col mio codice occorre invertire il risultato per ottenere un binario corretto, vuott mi aveva avvertito di leggerlo alla rovescia ma io non ho afferrato il senso vero.
Non chiedetemi il perchè ottengo il binario rovesciato, non l'ho (ancora?) capito, pazienza ho perso tempo mio.
Il mio codice si allunga di molto:
' Gambas module file
Public Sub Main()
Dim n, b, c As Integer
Dim s As String
n = 23750
Print "La rappresentazione binaria di "; n; " è ";
While n > 0
b = n Mod 2
'Print b;
s &= CStr(b)
If b <> 0 Then Inc c
n = n \ 2
Wend
s = Inverto(s)
Print s; " e contiene "; c; " bit a uno"
End
Private Function Inverto(valore As String) As String
Dim a As String
Dim l, i As Integer
l = Len(valore)
For i = l To 1 Step - 1
a &= Mid(valore, i, 1)
Next
Return a
End
Aggiungo anche il codice per ottenere il decimale da un binario:
' Gambas module file
Public Sub Main()
Dim b, t, i, e, f As Integer
Dim s As String
s = "101110011000110"
t = Len(s)
e = t
For i = 1 To t
b = CInt(Mid(s, i, 1))
Dec e
f += b * 2 ^ e
Next
Print f; " è la rappresentazione decimale di "; s
End
Ci sarà anche di meglio, ma questo è quanto sono riuscito a combinare oggi ;D
:ciao: :ciao:
Il mio codice si allunga di molto:
........
Private Function Inverto(valore As String) As String
Dim a As String
Dim l, i As Integer
l = Len(valore)
For i = l To 1 Step - 1
a &= Mid(valore, i, 1)
Next
Return a
End
Ci sarà anche di meglio, ma questo è quanto sono riuscito a combinare oggi
Puoi accorciare un po', usando una variabile vettoriale di tipo Byte[ ] ed in particolare il suo Metodo .Reverse( ):
Public Sub Main()
Dim n, b, c As Integer
Dim bb As New Byte[]
n = 23750
Print "La rappresentazione binaria di "; n; " è ";
While n > 0
b = n Mod 2
bb.Push(b)
If b <> 0 Then Inc c
n = n \ 2
Wend
bb.Reverse()
For b = 0 To bb.Max
Print bb[b];
Next
Print " e contiene "; c; " bit a 1"
End
Aggiungo anche il codice per ottenere il decimale da un binario:
' Gambas module file
Public Sub Main()
Dim b, t, i, e, f As Integer
Dim s As String
s = "101110011000110"
t = Len(s)
e = t
For i = 1 To t
b = CInt(Mid(s, i, 1))
Dec e
f += b * 2 ^ e
Next
Print f; " è la rappresentazione decimale di "; s
End
Ci sarà anche di meglio, ma questo è quanto sono riuscito a combinare oggi ;D
:ciao: :ciao:
Senza tanti fronzoli:
binario = "101110011000110"
Print CInt(Val(binario))
Notare il risultato. Se ti ricordi cosa ho scritto sul libro dovresti sapere il perchè... ;)
Rifatto, adesso dovrebbe funzionare bene:
Public Sub Form_Open()
Dim decimale As Integer
Dim i, bit As Byte
Dim binario As String
binario = "101110011000110"
For i = Len(binario) To 1 Step -1
bit = CByte(Mid$(binario, i, 1))
If bit = 1 Then decimale += 2 ^ (Len(binario) - i)
Next
Print decimale
End
Versione migliorata dell'esercizio che calcola quanti bit è lungo il numero, quindi indipendente dal tipo di variabile numerica (intera, ovviamente):
Public Sub Form_Open()
Dim numero As Long
Dim i, nbit, bitauno As Byte
numero = 23750
nbit = CByte(Log2(numero) + 1)
For i = 0 To nbit
If BTst(numero, i) = True Then Inc bitauno
Next
Print "Il numero di bit a uno è: "; bitauno
End