Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.011 c
1-74301
TUser
2003-10-13 09:26
2003.10.23
TCheckTreeView


3-73973
AlexGof
2003-10-01 11:43
2003.10.23
Нужен DataSet позволящий подсоединять несколько мастер таблиц


14-74378
Andryk
2003-09-18 11:55
2003.10.23
Точно говорят когда родился хохол еврей заплакал


3-74065
uu
2003-10-02 14:05
2003.10.23
импорт из HTML


6-74368
JorSand
2003-08-27 00:33
2003.10.23
Help. CRC Tcp пакета





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский