Autore Topic: Compitino per casa sui bit  (Letto 624 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Compitino per casa sui bit
« il: 20 Novembre 2016, 01:56:54 »
Poiché questa settimana siete stati eccessivamente vivaci e biricchini, ho trovato un nuovo compitino (che ho ripreso ed opportunamente adattato da un forum sul linguaggio C) da svolgere nel fine settimana :

" Scandire bit per bit il valore numerico 165 e stampare in console tutti i suoi bit impostati a 1 "
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #1 il: 20 Novembre 2016, 10:21:48 »
Poiché questa settimana siete stati eccessivamente vivaci e biricchini, ho trovato un nuovo compitino (che ho ripreso ed opportunamente adattato da un forum sul linguaggio C) da svolgere nel fine settimana :

" Scandire bit per bit il valore numerico 165 e stampare in console tutti i suoi bit impostati a 1 "

Scusi sig. Maestro,
ma come Lei ben sa, io in materia binaria sono parecchio asino.
Pertanto sono a domandare: Lei ci sta chiedendo di dare questa soluzione?
Oppure ci chiede di ciclare con mod il numero 165 / 2 ed estrapolare solo gli uno?
Con rinnovata stima ecc...


 
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #2 il: 20 Novembre 2016, 15:09:11 »
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.

« Ultima modifica: 20 Novembre 2016, 15:11:41 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #3 il: 20 Novembre 2016, 15:22:15 »
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:
Codice: [Seleziona]
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:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #4 il: 20 Novembre 2016, 16:46:38 »
Mooolto bene, Gianluigi !
Come Gianluigi ha ben dimostrato, è bastato il solo operatore aritmetico Mod per risolvere il problema.

Ho già aggiunto la tua soluzione alla pagina, che hai segnalato, della nostra WIKI.


Restiamo in attesa di altre possibili soluzioni.....
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #5 il: 20 Novembre 2016, 17:44:45 »
Ecco la mia soluzione:

Codice: [Seleziona]
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
« Ultima modifica: 20 Novembre 2016, 17:45:17 da Top Fuel »
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #6 il: 20 Novembre 2016, 18:28:15 »
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:
Codice: [Seleziona]
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
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #7 il: 20 Novembre 2016, 18:35:38 »
Ecco la mia soluzione:

:o

Ottimo TopFuel !
Ho posto il tuo codice come prima soluzione nella pagina della nostra WIKI !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #8 il: 20 Novembre 2016, 18:42:24 »
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....
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #9 il: 20 Novembre 2016, 19:42:19 »

Prova a leggere il tuo risultato da destra verso sinistra....

 ???

Ma la differenza?
« Ultima modifica: 20 Novembre 2016, 19:43:41 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #10 il: 20 Novembre 2016, 23:13:44 »
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:
Codice: [Seleziona]
' 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:
Codice: [Seleziona]
' 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:
« Ultima modifica: 20 Novembre 2016, 23:58:52 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #11 il: 20 Novembre 2016, 23:40:27 »
Ottimo TopFuel !
Ho posto il tuo codice come prima soluzione nella pagina della nostra WIKI !

Mi sento oDorato di tale oDore.  :D
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #12 il: 21 Novembre 2016, 00:40:42 »
... anche il fatto che 165 in binario è uguale in tutti e due i sensi di lettura e io mi sono fidato di questo risultato.
...in effetti è "palindromo"   :D
10100101


« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #13 il: 21 Novembre 2016, 01:03:52 »
Il mio codice si allunga di molto:
Codice: [Seleziona]
........

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( ):
Codice: [Seleziona]
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
« Ultima modifica: 21 Novembre 2016, 01:04:26 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Compitino per casa sui bit
« Risposta #14 il: 21 Novembre 2016, 13:06:38 »

Puoi accorciare un po', usando una variabile vettoriale di tipo Byte[ ] ed in particolare il suo Metodo .Reverse( ):
Codice: [Seleziona]
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

 :ok: Così è meglio.

Se avessi visto prima questa lezione, mi sarei risparmiato tanta fatica, anche se occorre dire che senza un po di fatica le cose non si capiscono a fondo.
Beh a fondo forse è troppo :) Comunque sia, per sintetizzare, così come si può riottenere un numero decimale dividendolo per 10 invertendo i suoi resti...:
Prendiamo come esempio il numero 451 :
451 / 10 = 45 Resto 1 (451 Mod 10 = 1)
45   / 10 =   4 Resto 5 (45   Mod 10 = 5)
4    / 10 =    0 Resto 4 (4     Mod 10 = 4)
...allo stesso modo possiamo ottenerne il corrispondente binario invertendo i resti della divisione per due:
451 / 2 = 225 Resto 1 (451 mod 2 = 1)
225 / 2 = 112 Resto 1 (225 Mod 2 = 1)
112 / 2 =   56 Resto 0 (112 Mod 2 = 0)
56   / 2 =   28 Resto 0 (56   Mod 2 = 0)
28   / 2 =   14 Resto 0 (28   Mod 2 = 0)
14   / 2 =     7 Resto 0 (14   Mod 2 = 0)
7     / 2 =     3 Resto 1 (7     Mod 2 = 1)
3     / 2 =     1 Resto 1 (3     Mod 2 = 1)
1     / 2 =     0 Resto 1 (1     Mod 2 = 1)
Raggiunto lo zero si termina.

Operazioni inverse (moltiplicazioni) per ottenere il decimale dal binario.

 :ciao: :ciao:
« Ultima modifica: 21 Novembre 2016, 13:15:00 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro