Autore Topic: Operazioni sui bit  (Letto 9221 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Operazioni sui bit
« Risposta #15 il: 31 Marzo 2009, 11:19:27 »
Citazione

leo72 ha scritto:
P.S.:
abbiamo fatto una figura barbina sulla mailing-list...
Benoit mi ha risposto... La funzione agisce correttamente, solo che non determina da sola il tipo di dato passato per cui se vogliamo avere lo spostamento bit per bit su un valore di tipo Byte dobbiamo specificarglielo esplicitamente con
Codice: [Seleziona]

SHL(CByte(197),3)

Il risultato è (correttamente) 40.


Mi spiace averti creato involontariamente sensi di "cattiva immagine del Forum" con Benoit, ma la documentazione fornita nella guida ufficiale non dice quello che mi hai suggerito con la tua rispo, quindi io non potevo sapere di scrivere un codice formalmente sbagliato. Aggiungo anche che in fase di avvio del prgramma non ho ricevuto nessuna segnalazione di errore di sintassi. A pag. 322 della guida "A Beginner's Guide to Gambas" la funzione Shl é illustrata così:
Citazione

       The   Shl   function   is   will   shift   the   value   of  MyInt  n  bits   left   where  n  is
specified by the second parameter.  When our user clicks the Shl button, we will
execute this code:
Codice: [Seleziona]

PUBLIC SUB SHLBtn_Click()
  DIM i AS Integer
  DIM result AS Integer
  DIM myInt AS Integer
  myInt = CInt(textbox1.text)
  IF Int(myInt >= 0) AND (myInt < 256) THEN
     result = CInt(TextBox2.Text)

     i = Shl(myInt, result)

     label5.Text = "SHL: " & Bin(i)
     label7.Text = Str$(i)
  ENDIF
END


Dopo l'applicazione del codice che mi hai suggerito ho appurato che funzionano bene sia la funzione SHL che la SHR; anche se, in base a quanto detto sempre nella guida ufficiale, mi aspettavo lo slittamento a sinistra o destra di una sola posizione di tutti i bit a partire dalla posizione scelta, mentre vengono slittati tanti bit quanto è il valore indicato nell'istuzione stessa( nel mio esempio "3"), a partire dalla posizione scelta , verso sinistra o verso destra. Quindi se così come stanno le cose la funzione si comporta bene lo specchietto di pag.319 dell guida si esprime in maniera errata:
Citazione

Shl Value = Shl(Number , Bit)  Returns operand1 with the bit specified in operand2  shifted left one bit position.
Shr Value = Shr(Number , Bit)  Returns operand1 with the bit specified in operand2  shifted right one bit position.

La mia non vuole essere una polemica, ma credo che un qualsiasi insieme di istruzioni, siano esse usate correntemente o, come nel caso di cui stiamo discutendo, come giustamente dice md9327, siano ormai cadute nel desueto, un manuale debba esprimersi con conforme completezza.
Io non so se quel manuale è manutenuto, ma se così fosse, dovrebbe essere corretto ed aggiornato.
Spero che la mia curiosità, destinata ad aumentare le mie conoscenze di Gambas e portata avanti, forse in maniera anche un pò esagerata, non abbia creato effetti negativi; il mio voleva essere soplo un contributo costruttivo. :-)  Saluti a tutti
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Operazioni sui bit
« Risposta #16 il: 31 Marzo 2009, 13:00:27 »
Non credo sia un problema, a mio avviso... domandare è lecito, rispondere è d'obbligo...

La richiesta fatta da leo mi è sembrata logica e giustificata, specialmente nel caso di una non ben chiara documentazione; se poi viene fatta a seguito di una svista, o di un non intendimento, siamo umani, per cui non siamo esenti da errori .

Riguardo al manuale che hai citato, a suo tempo gli avevo dato un'occhiata, e mi era sembrato buono a livello iniziale; però è da tener conto che è stato scritto da una persona che, come noi, ha sperimentato Gambas, e in particolare vecchie versioni.
Ovviamente, gran parte di quanto descritto è sempre e comunque valido, ma di certo non approfondisce molti degli aspetti.
Poi, come ho già detto, il manuale è basato su una vecchia versione di Gambas, e da quei tempi di acqua ne è passata...

Il manuale non mi pare sia manutenuto, dopotutto era scritto all'epoca con l'intendimento di fornire un approccio iniziale al linguaggio; aggiornarlo o farne uno nuovo è un'impresa abbastanza onerosa, e un esempio lo abbiamo con la documentazione ufficiale. Ad ogni modo, faccio i miei complimenti al coraggio avuto dall'autore, e alla sua fatica.

[per leo]
sicuramente esistono situazioni in cui non è possibile fare altrimenti; come nel tuo esempio sulla crittografia, la cosa viene da sè.
Comunque, di senso ne avrebbe, se non fosse che oggi nessuno si preoccupa del consumo delle risorse; il problema è che poi si preoccupa delle prestazioni... mah...
Il bello che questo discorso è, a mio avviso, la causa dell'ideologia generale attuale: basta vedere gli sprechi che si fanno in tutti i campi, e la monnezza che prima o poi ci sommergerà davvero...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Operazioni sui bit
« Risposta #17 il: 01 Aprile 2009, 10:56:20 »
@Pietro:
la mia non era una forma di richiamo nei tuoi confronti. Solo ammettevo con una frase enfatizzata ("figura barbina") che la domanda era risultata sì un po' "sciocca" ma solo perché io, come te, sono rimasto vittima per l'ennesima volta della documentazione lacunosa con cui abbiamo a che fare.
Tornando alle funzioni, lo spostamento è inteso sempre come numero di avanzamenti, non come identificativo del bit su cui operare. Quindi la guida in questo è errata.

@Luigi:
lo spreco di risorse è ormai implicito in ogni software che viene realizzato. Il problema deriva dal fatto che non abbiamo più a che fare con HW che non veniva modificato per anni (perché non era aggiornabile o era troppo costoso farlo) come negli anni '80. Se qualcosa non gira veloce, si prende e si cambia la macchina, non si pensa che magari con un'ottimizzazione del software si potrebbe ottenere lo stesso risultato.

Riguardo a quella guida, che è del 2005, va detto che è stata scritta per la versione 1.0 del linguaggio. E' normale che tante cose siano cambiate, soprattutto le funzioni sui bit che, come detto, sono state notevolmente riviste nella 2.8.2.
Sul fatto che non sia aggiornata, bisogna dire che Rittinghouse, così ho letto sulla mailing-list di Gambas, non sta bene in salute e non ha più intenzione di metterci le mani.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Operazioni sui bit
« Risposta #18 il: 12 Maggio 2012, 16:39:22 »
Detto questo, le funzioni sui bit operano in questo modo:
SHL(numero, spostamento): scorrimento a sinistra (SHift Left) di "spostamento" numero di posizioni i bit del numero "numero".
SHR(numero, spostamento):  scorrimento a destra (SHift Right) di "spostamento" numero di posizioni i bit del numero "numero"

Tieni cmq presente che le operazioni sui bit in Gambas non sono certo facili e spesso bisogna operare delle "manipolazioni" per ottenere gli stessi risultati del C (me ne sono accorto io convertendo algoritmi di cifratura da C a Gambas, algoritmi che nella stragrande maggioranza dei casi contemplano operazioni a livello di bit).

Mi viene da pensare che, nel caso della necessità di effettuare uno spostamento a sinistra dei bit, almeno la funzione SHL potrebbe essere sostituita con una semplice operazione, dato che - lo ricordo qui  a me stesso - lo spostamento a sinistra equivale al valore iniziale moltiplicato 2 elevato ad una potenza determinata dal numero dello spostamento delle posizioni.
Quindi, ad esempio, 6 << 3  equivale a 6 * 23 .

http://www.gambas-it.org/wiki/index.php?title=Sostituire_gli_operatori_logici_di_spostamento_dei_bit_con_semplici_operazioni
« Ultima modifica: 16 Dicembre 2013, 01:12:30 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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Operazioni sui bit
« Risposta #19 il: 12 Maggio 2012, 22:08:08 »
Magari mi sbaglierò, ma ho sempre saputo che le elevazioni a potenza sono molto più onerose come risorse di uno shift o anche semplicemente di una moltiplicazione.
Io mi ricordo che 2*2*2 è fatto molto più velocemente di 2^3.
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 md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Operazioni sui bit
« Risposta #20 il: 13 Maggio 2012, 12:36:13 »
I ricordi srvono a poco, in quanto tocca vedere com è stata implementata la routine di base.
Su esperienza avuta su linguaggi a basso livello, tra cui pure l'asm, le modalità con cui scrivere una determinata routine sono molteplici.
Se stiamo in ambito programmazione-ad-oggetti, lo scopo finale di tale approccio non ha come principio base l'ottimizzazione del codice di basso livello, ma altre cose. E' ovvio che la ricerca di miglioramenti e ottimizzazione è sempre attiva, e questo si può vedere già con linguaggi tipo java (se qualcuno ha domestichezza con esso), che ha fatto miglioramenti enormi rispetto a poco tempo fà (vedi grafica...).
Ribadisco ancora che Gambas è un linguaggio ad altissimo livello, e questo non implica che sia migliore, ma solo che è situato su uno strato software molto astratto, e si basa fondamentalmente su software esterno. Di suo ha pochissimo, quasi niente, e quindi dipende completamente dal funzionamento di questo substrato. Se vogliamo possiamo andare ad analizzare cosa c'è oltre, ma poi rischiamo di uscire fuori dal seminato.
Tanto per fare un esempio, già java si fonda su librerie scritte in C/C++, e già l'uso di una String ha valenza diversa dall'uso di una serie di caratteri in una determinata cella di memoria. La String è un oggetto, e quindi si porta dietro tutta una serie di cose che esulano dal concetto di ottimizzazione. La prova da fare è estremamente semplice, ma dato che questo studio l'ho fatto tanti anni fà, priprio perchè sviluppavo procedure real-time, è inutile e credo che chi l'ha già affrontato sà quanto è vero.