Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

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

 
opoloXAI ©   (2003-08-10 13:27) [0]

Добрый день.
Подскажите как проанализировать байт по-битно ("0" или "1")?
Заранее спасибо.


 
MBo ©   (2003-08-10 13:31) [1]

AND и SHL понадобится


 
opoloXAI ©   (2003-08-10 13:41) [2]

Я мимел в виду следующее:
1) с COM-порта я получаю по-байтно информацию, где по-битно прописано состояние датчиков ("вкл."/"выкл.")
2) затем мне нужно всю последовательность из трёх байт просмотреть и проанализировать состояние всех 24 датчиков.
По-этому и стал вопрос: как в одном байте определить состояние всех восьми бит ("0" или "1")?


 
MBo ©   (2003-08-10 13:49) [3]

if (ByteVar and (1 shl 5))<>0 then 5-й бит установлен.
удобнее заранее определить константы, например
Bit0=1;
Bit1=2;
и т.д.


 
Anatoly Podgoretsky ©   (2003-08-10 13:49) [4]

Дай расшифровку этого предложения
По-этому и стал вопрос: как в одном байте определить состояние всех восьми бит ("0" или "1")?


 
default ©   (2003-08-10 14:58) [5]

можещь юзать вот это:

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;


 
Лёша ©   (2003-08-10 16:06) [6]


> default ©

... гы - гы!
а чего так мало кода написал?

Делай как кажет MBo и все будет Ok!


 
marconi ©   (2003-08-10 23:45) [7]

я делал так:


function D2Bin(i1:byte;nb:byte):byte;
var p1:byte;

begin
p1:=0;
asm
pushad
clc
mov bl,i1
mov cl,nb
mov dl,0
rcl bl,cl
adc dl,0
mov p1,dl
popad
end;
result:=p1;

end;

тоесть D2Bin(255,1) возращает первый бит из байта D2Bin(255,2) второй бит из байта и т.д.


 
Marser ©   (2003-08-11 01:16) [8]

Вот это извращение! Неужели некльзя просто как поддсказал Mbo использовать and и shl? Неужели так мало людей знают элементарное логическое умножение и сдвиг влево?


 
Плохиш_   (2003-08-11 01:21) [9]

2Marser © (11.08.03 01:16)

Ну не только же сатириков слушать ;-)


 
Marconi ©   (2003-08-11 01:53) [10]

Все давно известно...просто разные варианты...пускай сам выбирает что ему больше нравится..вотеще для кучи:


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;



 
BillyJeans ©   (2003-08-11 08:47) [11]

вместо and и shl можно и test


 
Digitman ©   (2003-08-11 09:01) [12]


type
TFlags = (f0, f1, f2, f3, f4, f5, f6, f7);
TFlagSet = set of TFlags;
..
var
b: Byte;

...
if f0 in TFlagSet(b) then
ShowMessage("Bit 0 = 1")
else
ShowMessage("Bit 0 = 0")";
if f1 in TFlagSet(b) then
ShowMessage("Bit 1 = 1")
else
ShowMessage("Bit 1 = 0")";
if f2 in TFlagSet(b) then
ShowMessage("Bit 2 = 1")
else
ShowMessage("Bit 2 = 0")";
if f3 in TFlagSet(b) then
ShowMessage("Bit 3 = 1")
else
ShowMessage("Bit 3 = 0")";
if f4 in TFlagSet(b) then
ShowMessage("Bit 4 = 1")
else
ShowMessage("Bit 4 = 0")";
if f5 in TFlagSet(b) then
ShowMessage("Bit 5 = 1")
else
ShowMessage("Bit 5 = 0")";
if f6 in TFlagSet(b) then
ShowMessage("Bit 6 = 1")
else
ShowMessage("Bit 6 = 0")";
if f7 in TFlagSet(b) then
ShowMessage("Bit 7 = 1")
else
ShowMessage("Bit 7 = 0")";


 
default ©   (2003-08-11 09:04) [13]

Лёша © (10.08.03 16:06)
он уже давно был написан...
от позволяет работать без понимания сдвигов и тд
короче для удобства сделан...


 
Marser ©   (2003-08-11 11:49) [14]


> default © (11.08.03 09:04)

А как это можно быть программистов, не зная сдвигов и поразрядной логики?! Какое тут удобство?! А ну быстро к ЮЗ на уроки!


 
Anatoly Podgoretsky ©   (2003-08-11 11:59) [15]

Тяжело жить без пистолета



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

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
1-74152
Xtz
2003-10-10 19:12
2003.10.23
Люди хелпаните плизз .Вопрос по TreeView


4-74533
imp403
2003-08-16 12:55
2003.10.23
Как убрать приложение из окна вызываевамого по Alt+Tab и из Диспе


3-74058
tria
2003-10-02 10:27
2003.10.23
Как узнать, сколько строк вернул запрос?


6-74340
Kallega
2003-08-27 09:37
2003.10.23
Сканнер расшаренных ресурсов


6-74361
Terminus
2003-08-25 16:39
2003.10.23
Помогите найти компоненты для TCP... :)