Newsgroup: it.comp.lang.delphi
Titolo: Set bit in un byte

Come faccio a settare un bit in un byte
Voglio poter settare a piacimento a uno o a 0 uno dei 8 bit che formano un
byte.
Mi fate un esempio. io in matematica nisba :(((

 ha scritto nel messaggio
news:D49ba.37358$pG1.8...@news1.tin.it...

procedure PoniA(var valore:byte;bitdamodificare,posizione:byte)
//bitdamodificare=1 o 0,posizione da 0 a 7
begin
    if  bitdamodificare=0 then
        valore:=valore+2^posizione
    else
        valore:=valore-2^posizione;
end;
Ciao
Denis

        valore:=valore+2^posizione
In Delphi non esiste l'operatore ^ come elevamento a potenza.
-- 
Andrea Laforgia
Gioca a Tetris !
http://www.geocities.com/andrealaforgia/downloads.html


    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)

Mi fate un esempio. io in matematica nisba :(((
const
  Hex4Bin: array [0..15] of String =
  ('0000','0001','0010','0011','0100',
   '0101','0110','0111','1000','1001',
   '1010','1011','1100','1101','1110',
   '1111');
type
  TBit = 0..1;
  procedure SetBit(var AByte: Byte;
                       APos: Integer; ABit: TBit);
  // APos  =  7  6  5  4  3  2  1  0
  // AByte = [b][b][b][b][b][b][b][b]
  begin
    case ABit of
      0: AByte := AByte and (not (1 shl APos));
      1: AByte := AByte or (1 shl APos);
    end;
  end;
  function ByteHi(B: Byte): Byte;
  begin
    Result := (B and $F0) shr 4;
  end;
  function ByteLo(B: Byte): Byte;
  begin
    Result := B and $0F;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var
  B: Byte;
begin
  B := $FF;
  ShowMessageFmt('%s%s', [Hex4Bin[ByteHi(B)], Hex4Bin[ByteLo(B)]]);
  SetBit(B, 3, 0);
  ShowMessageFmt('%s%s', [Hex4Bin[ByteHi(B)], Hex4Bin[ByteLo(B)]]);
  SetBit(B, 5, 0);
  ShowMessageFmt('%s%s', [Hex4Bin[ByteHi(B)], Hex4Bin[ByteLo(B)]]);
  SetBit(B, 3, 1);
  ShowMessageFmt('%s%s', [Hex4Bin[ByteHi(B)], Hex4Bin[ByteLo(B)]]);
  SetBit(B, 5, 1);
  ShowMessageFmt('%s%s', [Hex4Bin[ByteHi(B)], Hex4Bin[ByteLo(B)]]);
end;


Ops scusa č stato un attimo di panico!!
Ero senza IDE e a memoria.. Ok mi sono tradito come ex-programmatore VB...
Vabbč..
Denis

 ha scritto nel messaggio
news:D49ba.37358$pG1.8...@news1.tin.it...


 ha scritto nel messaggio
news:D49ba.37358$pG1.8...@news1.tin.it...


 Ora avrei bisogno del contrario cioe sapere un determinato bit in un byte
scritta al volo:
Function Bitvalue (Valore:Integer;Bit:Integer):Boolean;
begin
 result:=odd(valore shr bit);
end;
Ciao
Matteo

Ora avrei bisogno del contrario cioe sapere un determinato bit in un byte
function GetBit(var AByte: Byte;
                    APos: Integer): TBit;
// APos  =  7  6  5  4  3  2  1  0
// AByte = [b][b][b][b][b][b][b][b]
begin
  Result := (AByte shr APos) and 1;


 end;
Ma se il bit da attivare è già attivo, non funziona! Usa AND, NOT e OR
invece di - e +.
A.

       1: AByte := AByte or (1 shl APos);
Quindi in Delphi esistono le funzioni and e or su interi?
Sono sempre stato convinto del contrario... (in un vecchio documento, non mi
ricordo se di Kernighan o Ritchie, si diceva che era uno dei vantaggi del C
rispetto al Pascal)

rispetto al Pascal)
Probabilmente il famoso "Why Pascal Is Not My Favourite Language" di
Kernighan, ma, che io sappia, non si parla di questo.


 Kernighan, ma, che io sappia, non si parla di questo.
Esattamente quello... E la frase era nel paragrafo 5. La riporto:
"There is a paucity of operators (probably related to the paucity of
precedence levels).  In particular, there are no bit-manipulation operators
(AND, OR, XOR, etc.).  I simply gave up trying to write the following
trivial encryption program in Pascal:
    i := 1;
    while getc(c) <> ENDFILE do begin
        putc(xor(c, key[i]));
        i := i mod keylen + 1
    end
because I couldn't write a sensible 'xor' function.  The set types help a
bit here (so to speak), but not enough; people who claim that Pascal is a
system programming language have generally overlooked this point."

 system programming language have generally overlooked this point."
Dirò una stupidaggine, ma bisogna vedere a quale versione del Pascal fa
riferimento quel testo.
Il Pascal è un linguaggio che è stato depositato come standard
ISO...quella versione del Pascal non gode di tutte le potenzialità che
vengono offerte invece dal linguaggio Object Pascal di Delphi, pertanto
se ci si sta riferendo a quella versione le affermazioni fatte possono
essere giuste, benchè non valgano per il linguaggio di Delphi.


(AND, OR, XOR, etc.).  
Kernighan ha ragione per quanto riguarda il Pascal standard di cui
egli parla (ricordati, comunque, che quel documento è abbastanza
vecchio).  Chiaramente, ormai Delphi, dialetto del Pascal standard, è
adatto per una programmazione avanzata come quella C (che rimane un
linguaggio, però, sotto certi punti di vista, dalle potenzialità
insuperabili).
-- 
Andrea Laforgia
http://www.geocities.com/andrealaforgia
/* shakespeare.c */
#define QUESTION ((bb) || (!bb))