function ExtractBits(const aValue, aStart, aCount: Integer): Integer; const Mask : array[0..31] of Integer = ( $01, $03, $07, $0F, $1F, $3F, $7F, $FF, $01FF, $03FF, $07FF, $0FFF, $1FFF, $3FFF, $7FFF, $FFFF, $01FFFF, $03FFFF, $07FFFF, $0FFFFF, $1FFFFF, $3FFFFF, $7FFFFF, $FFFFFF, $01FFFFFF, $03FFFFFF, $07FFFFFF, $0FFFFFFF, $1FFFFFFF, $3FFFFFFF, $7FFFFFFF, $FFFFFFFF ); asm xchg ecx,edx test edx,edx jnz @@isoke xor eax,eax jmp @@ending @@isoke: dec edx and edx,31 shr eax,cl and eax,dword ptr [Mask+edx*4] @@ending: end; function GetBit(a, n : Integer): Integer; begin result := 1 and (a shr n); end; function GetBitState(a, n : Integer): Boolean; begin result := (1 and (a shr n)) > 0; end; procedure SetBitOff(var a : Integer; n : Integer); begin a := a and (not(1 shl n)); end; procedure SetBitOn(var a : Integer; n : Integer); begin a := a or (1 shl n); end; procedure SetBitToggle(var a : Integer; n : Integer); begin a := a xor (1 shl n); end;