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

Вниз

Пересылка бита из одной переменной в другую   Найти похожие ветки 

 
Evg12   (2003-06-02 12:39) [0]

Уважаемые. Можно ли каким-либо образом организовать
пересылку БИТА из одной переменной типа byte, word, integer
в другую переменную (за раннее тип одной и второй не известен)
по принципу как это делается со строковыми переменными.
str, str1: string;
str:=str[2];
То есть сделать так чтоб происходила пересылка бита в числовой переменной,
точно также, как это делается с символами в строковых переменных.

Но операция занимала минимум процессорного времени.

Сначала я собирался разложить обе переменные на биты,
переслать из одной в другую бит,
а потом собрать их опять в число и положить обратно.
Процедуру написал на ассемблере но слишком много
она времени жрет.
Особенно те части проверки размера (физически в байтах) переменных.
Нужно что-то проще и быстрее.


 
Skier ©   (2003-06-02 12:42) [1]

>Evg12 (02.06.03 12:39)
-Проверить установлен ли бит в первой переменной.
-Если установлен, то установить его во второй.

IMHO, не сложно...


 
Sandman25 ©   (2003-06-02 12:44) [2]

const bit = $000800;
if source and bit
then destination := destination or bit
else destination := destination and not bit;
?


 
Anatoly Podgoretsky ©   (2003-06-02 12:47) [3]

Ничего заранее проверять не нужно, использовать сразу NOT/AND/OR


 
DrPass ©   (2003-06-02 12:51) [4]

Еще проще:
destination:=(destination and $FFF7FF) or (source and $800))


 
kull ©   (2003-06-02 13:05) [5]

Напиши отдельную функцию и положи ее себе в какую нибудь библиотеку для дальнейшего пользования. Чтоб было на все случаи жизни... А не на один раз. И чтоб потом не заниматься галиматьей вроде - "a and $800".

Например:

function SetBit(const Source, BitNumber: Integer;
const SetUp: Boolean): Integer;
begin
Result := Source and not (1 shl BitNumber) or (Integer(SetUp) shl BitNumber);
end;


 
Evg12   (2003-06-02 13:20) [6]

To kull: Спасибо. Это именно то что мне было нужно.
Я вот какраз и не захотел заниматься галиматьей, как ты сказал и написал в конфу.


 
VaS ©   (2003-06-02 13:24) [7]

Функция хорошая, да только понимания сдвиговых операций г-ну Evg12 она не дала.


 
kull ©   (2003-06-02 13:27) [8]


> VaS © (02.06.03 13:24)

Да, могет быть...
Да я... Да я... Да я хотел в принципе сказать, что подобные вещи нужно записывать в библиотечные функции... :)


 
Skier ©   (2003-06-02 13:36) [9]

Можно ещё так изобразить (как вариант) :

function TurnBitOn(const AValue, ABit : Byte) : Byte; assembler;
asm
MOV AL, AValue
BTS EAX, ABit
end;


 
Anatoly Podgoretsky ©   (2003-06-02 13:38) [10]

Базовые логические операции не могут являться галиматьей.


 
kull ©   (2003-06-02 14:59) [11]


> Anatoly Podgoretsky © (02.06.03 13:38)

Галиматьей могут стать еще более базовые вещи, если не пытаться сделать свой код более гибким, модифицируемым и т.п.


 
Evg12   (2003-06-03 13:48) [12]

to kull ©, VaS © и другим, может пригодится.

Функция пересылки бита из одной переменной в другую.
Модифицированный мной варивнт функции SetBit от kull © Результатом функции является модифицированная переменная Target

function TForm1.SendBit(Source, SourceBitNumber, Target, TargetBitNumber: Integer): Integer;
begin
Result := Target and not (1 shl TargetBitNumber) or (((Source and (1 shl SourceBitNumber)) shr SourceBitNumber) shl TargetBitNumber);

Спасибо всем. тема закрыта.

end;



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

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

Наверх




Память: 0.49 MB
Время: 0.016 c
1-50312
Maks Realov
2003-06-03 11:34
2003.06.16
Inside COM.


14-50438
SH
2003-05-29 14:14
2003.06.16
Уменьшение объёма exe-файлов


1-50298
dataMaster
2003-06-04 16:30
2003.06.16
Национальные названия


1-50306
Fuelfire
2003-06-03 11:45
2003.06.16
SaveDialog


14-50466
Леприкон
2003-05-30 07:22
2003.06.16
Начинающим программистам. Этап 5.