Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Effizientes Arbeiten mit Bitmasken

  Alt 3. Jul 2007, 00:35
Als Ergänzung noch:

Die heutigen CPUs arbeiten alle intern mit Zahlen in Binärer Darstellung. Eine beliebige Zahl setzt sich also aus einzelnen Ziffern zusammen und deren Position in der Zahl bestimmt deren Wertigkeit. Also ganz einfach die Dezimale Zahl 4321 ist gleich 4*10^3 + 3 * 10^2 + 2*10^1 + 1 * 10^0. Die Potenzen stellen die Wichtingen der Ziffern dar und die 10 die Basis unserer Zahlendarstellung.
Auf Binärrechnern besteht also ein Byte = 8 Bits aus folgenden Wichtungen:

Code:

Bit#                   7  6  5  4 3 2 1 0
Potenz zu 2^Bit#     128 64 32 16 8 4 2 1
Es haben sich par Reglen eingebürgert:

1.) man schreibt eine Zahl immer von Links nach Rechts mit der höchstwertigen Ziffer als erstes, dh. ganz rechts steht das LSB -> Low Significant Bit. Die Zahl 4321 = viertausenddreihunderteinundzwanzih schreibt man ja auch 4321 und nicht 1234.

2.) man nummeriert die Bitpositionen in einem Byte immer mit der Postion 0 beginnend und nicht mit 1, also 0'basierter Index. Das macht Sinn da die Position/Index/Wertigkeit eines Bits damit identisch zur Potenzschreibweise wird. Das Bit 0 hat also immer die Wertigkeit 1, egal welche Zahlenbasis vorliegt. Das Bit 3, eg. die Ziffer an Position 3, hat damit immer die Wertigkeit Basis^3 und im Binärsystem 2^3 = 8.

Wenn man zb. 00011101b (das b steht für binär, o für oktal, d für dezimal und h für hexadecimal) ausschreibt sollte man es so machen

0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 1*2^0 oder eben
0*128 + 0*64 + 0*32 + 1*16 + 1*8 + 1*4 + 0*2 + 1*1 oder
16 + 8 + 4 + 1

Wichtig ist wieder, von Links nach Rechts vom Höchstewertigen zum Nidrigstwertigen. Das ersparrt einiges an Verwirrung, wenn Schlaumeier zb. meinen sie müssten die Bitindizes 1'basiert indzieren statt 0'basiert, oder eben meinen die Reihenfolge in der Schreibweise umdrehen zu müssen. Da ich nicht nur Software entwickle sondern auch im Hobby einiges an Elektronik mache weis ich zb. das besonders in der Elektronik/Datenblättern von CPU/MCU obige 2 Regeln gelten.


Neben den Boolschen Funktionen wie AND,XOR,OR,NOT etc. pp. verstehen heute Rechner auch die Multiplikation/Divison mit einem Wert zur einer Potenz der Zahlendarstellung des Rechners. Es gibt also Befehle die eine Zahl mit Basis^X multiplizieren oder dividieren können. In unserem Falle also mit 2^x. Diese Befehle nennt man Schiebebefehle oder besser Shift-Operations. In Delphi

shl = shift left = * 2^x
shr = shift right = div 2^x

Möchte man nun obige Konstanten wie

Delphi-Quellcode:
const
  flLesen = 1;
  flSchreiben = 2;
  flAusfuehren = 4;
  flAnzeigen = 8;
  flLoeschen = 16;
deklarieren dann sind diese identisch zu

Delphi-Quellcode:
const
  flLesen = 1 shl 0;
  flSchreiben = 1 shl 1;
  flAusfuehren = 1 shl 2;
  flAnzeigen = 1 shl 3;
  flLoeschen = 1 shl 4;
Wir haben also die Bitposition innerhalb unseres Bytes direkt benutzt um die Wertigkeiten zu ermitteln.

Eine Funktion die ein Bit in einem Byte setzt könnte nun so aussehen:
Delphi-Quellcode:
procedure SetBit(var Value: Byte; Bit: Integer);
begin
  Value := Value or (1 shl Bit);
end;

Gruß Hagen
  Mit Zitat antworten Zitat