Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Вниз

Как извлечь значение конкретного бита в типе byte?   Найти похожие ветки 

 
NetKnight   (2003-07-29 13:16) [0]

Субж! Считываю в буфер информацию, а обработать её надо побитно.. Как извлечь значения?

И ещё в добавок: как наиболее оптимально считать из файла данные и представить их в бинарном виде?
В данный момент юзаю BlockRead, а потом конвертирую в массив из byte.


 
VaS   (2003-07-29 13:35) [1]

IsFiveBit := (b shr 6) and 1 <> 0;


 
Verg   (2003-07-29 13:36) [2]

if (<переменная типа byte> and (1 shl <номер конкретного бита>))<>0 then <этот бит =1> else <этот бит=0>

Биты нумеруются 0..7


> В данный момент юзаю BlockRead, а потом конвертирую в массив
> из byte.


Интересно как выглядит "конвертация".


 
Verg   (2003-07-29 13:38) [3]


> VaS ©


Тож нормально. Если уж совсем на Паскале, то
odd(b shr n), b- байт(и не только) n -номер бита


 
HolACost   (2003-07-29 14:40) [4]

Лишний вызов - это уже серьёзнее!


 
han_malign   (2003-07-29 15:05) [5]

> IsFiveBit := (b shr 6) and 1 <> 0;
- а не проще, тогда уж IsFiveBit := (b and $20) <> 0
хотя (1 shl < константа - номер конкретного бита>) - это константа рассчитанная на этапе компиляции ((1 shl 5)<==>$20)...

а битовый поток действительно:

for j:=0 to DataSize-1 do begin
b:=Data[j];
for i:=0 to 7 do begin
if((b and 1)<>0)then DoBit1
else DoBit0;
b:=b shr 1;
end;
end;

хотя, для удобства чтения битового потока(глазами), в шестнадцатиричном побайтовом виде, обычно, делают первый бит старшим (CA BE ==> 11001010 10111110, вместо 0101001 10111110 1 ==>56 7D - с первым удобнее читать поток,байты переворачивать не надо(в голове)) и разбирать поток надо:

for j:=0 to DataSize-1 do begin
b:=Datap[j];
for i:=0 to 7 do begin
if((b and $80)<>0)then DoBit1
else DoBit0;
b:=b sh l 1;
end;
end;



 
default   (2003-07-29 16:08) [6]

можно юзать вот этот класс


EBitsError_ = class(Exception);
TRange = (r_8, r_16, r_32);

TBits_ = class
private
FNumber: Cardinal;
FRange: Byte;
function GetBit(Index: Byte): Boolean;
procedure SetBit(Index: Byte; Value: Boolean);
procedure SetRange(Value: TRange);
function GetRange: TRange;
procedure SetNumber(Value: Cardinal);
procedure Error;
public
constructor Create(Number: Cardinal; RangeValue: TRange = r_32);
property Number: Cardinal read FNumber write SetNumber;
property Bits[Index: Byte]: Boolean read GetBit write SetBit; default;
property Range: TRange read GetRange write SetRange;
end;

constructor TBits_.Create(Number: Cardinal; RangeValue: TRange = r_32);
begin

FNumber := Number;
Range := RangeValue

end;

function TBits_.GetRange: TRange;
begin

case FRange of
$F8: Result := r_8;
$F0: Result := r_16;
$E0: Result := r_32;
end;

end;

procedure TBits_.SetRange(Value: TRange);
begin

case Value of
r_8 : begin
FRange := $F8;
FNumber := FNumber and $000000FF;
end;
r_16 : begin
FRange := $F0;
FNumber := FNumber and $0000FFFF;
end;
r_32 : FRange := $E0;
end;

end;

procedure TBits_.Error;
begin

raise EBitsError_.Create("The borders are broken")

end;

function TBits_.GetBit(Index: Byte): Boolean;
asm

MOV DH, Self.FRange
TEST DL, DH
JNZ TBits_.Error
MOV EAX, Self.FNumber
MOV CL, DL
SHR EAX, CL
AND EAX, 1

end;

procedure TBits_.SetBit(Index: Byte; Value: Boolean);
asm

MOV DH, Self.FRange
TEST DL, DH
JNZ TBits_.Error
MOVZX EDX, DL
TEST CL, 1
JZ @@ResetBit
BTS Self.FNumber, EDX
RET
@@ResetBit:
BTR Self.FNumber, EDX

end;

procedure TBits_.SetNumber(Value: Cardinal);
begin

if Value <> FNumber then begin
FNumber := Value;
Range := Range;
end;

end;


procedure TForm1.Button3Click(Sender: TObject);
var
b: TBits_;
begin

b := TBits_.Create($FFFFFFEF, r_16);
// b.Number = $0000FFEF
b.Range := r_8;
// b.Number = $000000EF ( $EF = 11101111b )
if not b[4] then begin b[4] := True; b[0] := False; end;
// b.Number = $000000FE ( $FE = 11111110b = 254 )
Caption := IntToStr(b.Number);
Sleep(1000);
try // исключение - обращение к 8 биту при Range = r_8
b[8] := True;
except
on EBitsError_ do Caption := "Обработка исключения класса TBits_";
end;

end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
4-33410
sucer
2003-06-07 18:46
2003.08.11
Недать нарисоваться на экране


1-33091
Evg12
2003-07-26 19:44
2003.08.11
Таймер в микровекундах.


14-33365
Fenik
2003-07-17 12:48
2003.08.11
Охота на фишку закончена.


14-33344
Ravshan
2003-07-25 10:15
2003.08.11
Подскажите Editor или Viewer для DOS/WIN текста


1-33116
voprosik
2003-07-29 11:11
2003.08.11
Есть ли способ выводить на канвас





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский