Newsgroup: it.comp.lang.delphi
Titolo: La matematica .....

La matematica non e la mia passione mi dite due cose come faccio a settare un
determinto bit in un byte, e un byte in un LongWord, Non Mandatemi a quel
paese.
Grazie
-- 
Posted from  [212.171.179.11] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Umby Illo wrote:

Ciao, puoi farlo utilizzando delle maschere e usando gli operatori logici (or o
xor), ma tutto dipende dall'uso che ne vuoi fare. Se il bit è all'inizio o alla
fine del byte puoi, usando un po di assembly, caricare il byte in un registro e
shiftando a destra o a sinistra...la spiegazione diviene un po lunga e complessa.
Prova a seguire questo link 
www.sendai.it/encom
 e scaricare la unit StegoU. Dagli
un occhiata xke c'è una procedura ke setta il primo bit di un byte. Spero possa
bastarti.
By Enri'S

Grazie
Aho ma lo sai che non so se esiste una sintassi per descrivere i
numeri binari così come avviene per gli esadecimali in delphi ... tipo
$0a1b2c3d ...
Comunque tu cosa intendi per settare? In termini di logica binaria
dovrebbe intendersi porre a 1, ma forse tu intendi a 1 o a zero a
seconda ...
comunque, per quanto riguarda il bit nel byte puoi fare così:
Procedure Settabit(Var ilbyte:Byte; Numerobit:Byte; auno:Boolean); 
 Begin
   Numerobit:=1 shl numerobit;
   if auno then Ilbyte:=ilbyte or Numerobit
    else  begin
              Numerobit:=Not Numerobit;
              ilbyte:=Ilbyte and Numerobit
            end
end;
Numerobit, che dev'essere compreso tra 0 e 7, indica il bit da settare
a 1 (auno=true) o a zero (auno=false). Ricorda che il bit 0 è quello
meno significativo del byte che, abitualmente, è di 8 bit.
Se devi fare qualcosa di più complesso come porre a 1
contemporaneamente  una serie di bit, con una maschera del tipo:
10011010 
l'operatore logico da usare è or:
ilbyte or 10011010 
naturalmente prima converti il numero in decimale
se vuoi invece azzerare quelli con 0 sostituisci and;
Per quanto riguarda il byte di una dword:
Procedure assegnadword(Var ladword:Dword; numerobyte,valore:Byte);
 begin
  ladword:=(ladword and not(255 shl (numerobyte shl 3)))
            or (valore shl (numerobyte shl 3))
 end;
// minchia, il bello è che 'sta roba funziona pure!
numerobyte deve essere compreso tra 0 e 3 e indica la posizione del
byte nella dword, valore è il valore da assegnargli.
Sembrerebbe un mattone di calcolo, invece gli shl, gli and e or sono
cose piuttosto leggere per il processore. 
Comunque se te serve una cosa high-tech puoi fare una procedura
assembler o guardare nell'help se non c'è qualcosa già pronto: io sono
famoso per i lavori inutili...
 
Ciauz
Ps.: Non ho provato attentamente 'ste procedure, se te servonono per
spedire un satellite in orbita prima provale bene.
---------------------------------------------
Io queste cose tecnologiche non le capisco...

 paese.
Ciao, queste dovrebbero funzionare (scritte un po' di tempo fa..):
Function GetBit ( X : integer; index : byte ) : boolean;
asm
      bt     eax, index
      setb   @result
end;
//////
Procedure SetBit ( var X : integer; index : integer; T : boolean );
// EAX = @X  [EAX] = X
Asm
        OR      T,T            // CarryFlag := T
        JZ      @@F            // if T then Bit Test and RESET
        BTS     [EAX], index   // Bit Test and SET
        JMP     @@exit
@@F:    BTR     [EAX], index   // Bit Test and RESET
@@exit:
End;
Ciao!!!
Davide DG.

 e un byte in un LongWord
procedure LongintToBytes(Target :longint; var B1,B2,B3,B4 :byte);
begin
  B1 := LO(Target);
  B2 := HI(Target);
  Target := Target SHR 16;
  B3 := LO(Target);
  B4 := HI(Target);
end;
function BytesToLongint(B1,B2,B3,B4:byte):longint;
begin
   result:=0;
   result:=result or B4;
   result:=result shl 8;
   result:=result or B3;
   result:=result shl 8;
   result:=result or B2;
   result:=result shl 8;
   result:=result or B1;
end;

 seconda ...
Settare = porre a 1.
Resettare = porre a 0.
-- 
Posted from  [80.105.34.80] 
