Как получить доступ к битам переменной и управлять их значением?

Материал из DRKB

Как получить доступ к битам переменной и управлять их значением?[править | править код]

unit Bitwise;

interface

function IsBitSet(const val: longint; const TheBit: byte): boolean;
function BitOn(const val: longint; const TheBit: byte): LongInt;
function BitOff(const val: longint; const TheBit: byte): LongInt;
function BitToggle(const val: longint; const TheBit: byte): LongInt;

implementation

function IsBitSet(const val: longint; const TheBit: byte): boolean;
begin
  result := (val and (1 shl TheBit)) <> 0;
end;

function BitOn(const val: longint; const TheBit: byte): LongInt;
begin
  result := val or (1 shl TheBit);
end;

function BitOff(const val: longint; const TheBit: byte): LongInt;
begin
  result := val and ((1 shl TheBit) xor $FFFFFFFF);
end;

function BitToggle(const val: longint; const TheBit: byte): LongInt;
begin
  result := val xor (1 shl TheBit);
end;

end.


ID: 00218



 SetWord - слово, которое необходимо установить.
 BitNum - номер бита, который необходимо выставить согласно определениям в секции const (Bit0, Bit1 и др.).
 GetBitStat возвращает значение True, если бит установлен и False - в противном случае.


const
 Bit0 = 1;
 Bit1 = 2;
 Bit2 = 4;
 Bit3 = 8;
 Bit4 = 16;
 Bit5 = 32;
 Bit6 = 64;
 Bit7 = 128;

 Bit8 = 256;
 Bit9 = 512;
 Bit10 = 1024;
 Bit11 = 2048;
 Bit12 = 4096;
 Bit13 = 8192;
 Bit14 = 16384;
 Bit15 = 32768;

procedure SetBit(SetWord, BitNum: Word);
begin
  SetWord := SetWord Or BitNum;        { Устанавливаем бит }
end;

procedure ClearBit(SetWord, BitNum: Word);
begin
  SetWord := SetWord Or BitNum;       { Устанавливаем бит }
  SetWord := SetWord Xor BitNum;      { Переключаем бит }
end;

procedure ToggleBit(SetWord, BitNum: Word);
begin
  SetWord := SetWord Xor BitNum;      { Переключаем бит }
end;

function GetBitStat(SetWord, BitNum: Word): Boolean;
begin
  GetBitStat := SetWord and BitNum = BitNum; { Если бит установлен }
end;

Источник: Книга В. Озерова "Delphi. Советы программистов"


Author: StayAtHome
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 00219