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

Вниз

Как сделать преобразователь Hex to Bin   Найти похожие ветки 

 
Onward ©   (2003-11-03 03:22) [0]

Есть стандартый метод, (HexToBin(...)) но этот вариант не подходит.

const
MyVal = $FF;

и сделать так, чтобы я получил с hex значения именно так 11111111 и в таком формате что-бы я смог обратится к каждому значению двоичного кода по индексу... тоесть если индекс будет равен 8(байт), значение будет 1.
Помогите пожалуйста...


 
default ©   (2003-11-03 03:27) [1]



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

// Вход: Index --> DL, Self --> EAX
// Выход: Result --> EAX

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

// Index --> DL, Self --> EAX, Value --> CL

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;

вот откопал...как понял нужно что-то вроде этого


 
Onward ©   (2003-11-03 03:29) [2]

Мдаааааа!!! Это для меня тяжело!! Но ВсЕрАвНо СПАСИБО!!!
Поробуем....
Хотя должен быть метод по короче... :)))) Будем искать..


 
default ©   (2003-11-03 03:35) [3]

function GetBitValue(const Value: Integer; const Index: Byte): Boolean;
begin

Result := Value shr Index and 1 = 1

end;

может это...
PS индексация битов принята с нуля справа налево


 
Onward ©   (2003-11-03 03:37) [4]

Кстати, Уважаемый default, а вы владеете asm?


 
default ©   (2003-11-03 03:45) [5]

Onward © (03.11.03 03:37) [4]
смотря, что понимать под "владеете"...
я изучал его в основном для вставок...что-то большое на нём не писал...


 
Onward ©   (2003-11-03 03:49) [6]

вообще я asm незнаю, нуу вообщем только там

mov ax, a
add ax, b
mov @result, ax

мелоч

а вот как сделать на asm такого рода

for i:=0 to 10 do
for j:=0 to 10 do
FillScreen(i, j, ClRed);

для того чтобы ускорить операцию??


 
default ©   (2003-11-03 03:53) [7]

Onward © (03.11.03 03:49) [6]
лучший твой учитель это окно отладчика(где асмовый код приведённых тобой циклов есть), справочник по командам и практика
всё)
часто чтобы что-то заоптимизировать сначала пишут на Delphi потом смотрят ассем-ый код в отладчика и оптимизируют
иногда это медленней(может даже часто) чем сразу писать на асме
на сайте Анатолия Подгорецкого есть статьи по оптимизации


 
Onward ©   (2003-11-03 04:00) [8]

Огромное тебе спасибо!!!
Вот мучаюсь я с этим асмом и ни как.. Но учитываю то что, тот кто идет, тот дойдет до конца...

Когда-то я pascal вообще не знал, а теперь могу что-то сделать:)
Хотя недостатка знания asm это лажа:(((

Стараюсь понять..

А адресочек Анатолия Подгорецкого???

Желаю удачи!!


 
default ©   (2003-11-03 04:03) [9]

Onward © (03.11.03 04:00) [8]
посмотри по сабжам где он отвечает, зайди в один из них и щёлкни справа от ника значок


 
Onward ©   (2003-11-03 04:09) [10]

Спасибо! Удачи...


 
default ©   (2003-11-03 04:11) [11]

Onward © (03.11.03 04:09) [10]
удачи те тоже)спать надо дуть)


 
Anatoly Podgoretsky ©   (2003-11-03 08:46) [12]

http://www.delphikingdom.com/lyceum/seminar.asp?partID=4&LessonID=11

http://podgoretsky.com/ddp.html



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
6-41873
LeNa19
2003-09-07 13:52
2003.11.13
как правильно задействовать в нити класс TClientSocket


14-42103
PVOzerski
2003-10-22 15:03
2003.11.13
Скандал вокруг прокси


1-41266
Serg™
2003-10-31 16:23
2003.11.13
Help


3-41076
BigVova
2003-10-23 15:02
2003.11.13
Поддерживают ли IBX изменения в FB 1.5?


1-41519
Jack
2003-10-27 16:10
2003.11.13
Инициализация DLL