Форум: "Система";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизКак разложить байт по-битно? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c