Shl Value = Shl(Number , Bit) Returns operand1 with the bit specified in operand2 shifted left one bit position.Citazione
che credo voglia dire: "Restituisce operand1 con il bit specificato in opernd2 slittato a sinistra di una posizione
per cui se operand1 contiene "00010100" e operand2 contiene "2" il risultato prodotto da Shl dovrebbe essere "00101000".
The Shl function is will shift the value of MyInt n bits left where n is.
specified by the second parameter.Citazione
che credo voglia dire: "la funzione "Shl" svolge lo slittamento del valore di MYiInt(operand1) di n bit a sinistra dove n"n" è specificato dal secondo parametro (operand2).
ho eseguito la prova partendo da operand1=10010110 e operand2=3 il risultato é stato: "10010110000" cioè esattamente quello spiegato nell'esempio.
leo72 ha scritto:
Le funzioni sui bit avevano dei bug e sono state corrette in una delle ultime versioni di Gambas.
Quindi, intanto sarebbe interessante sapere quale versioni usi.
leo72 ha scritto:
Detto questo, le funzioni sui bit operano in questo modo:
.............................
Ceskho ha scritto:
Per la modifica di singoli bit in programmi che ad esempio modificano solo dati espressi in byte è possibile usare un metodo definito "con maschera".....
ma se manipolo con le funzioni Shl, Shr, Rol, Ror un campo grande 1 byte(8 bit), il risultato dopo la manipolazione non può tradursi nell'ottenimento di un campo da 4 byte o più.
RisultatoIntero = &H000000 OR ValoreByte
leo72 ha scritto:
La 2.9 dovrebbe essere esente dai bug. Dal changelog (che ho ricontrollato) le operazioni sui bit sono state sistemate nella 2.8.2.
leo72 ha scritto:
Sì, è vero.
Ho effettuato dei test ed ho notato che la funzione Shl non... funziona.
leo72 ha scritto:
BTst lavora correttamente: BTst(197,3).
PRIVATE i AS Integer
.................
PUBLIC SUB TestBtn_Click()
MioIntero = CInt(TextBox1.Text) 'converte la stringa digitata in un valore intero
IF Int(MioIntero >= 0) AND (MioIntero < 256) THEN
result = CInt(TextBox2.Text) - 1
i = BTst(MioIntero, result) 'esegue il test sul bit indicatto in result
TextLabel7.Text = "BTst(" & MioIntero & "," & result & ")=" & i
TextLabel9.Text = Str$(i) 'restituisce il bit esaminato
ENDIF
End
SHL(CByte(197),3)
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 conCodice: [Seleziona]
SHL(CByte(197),3)
Il risultato è (correttamente) 40.
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
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.
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).