Вниз
Скачать: CL | DM;

Примеры "нестандартных" решений.   Найти похожие ветки 

← →
CHES ©   (2005-09-30 08:45) [0]

Предположим нужно написать процедуру, которая устанавливает в переменной заданный бит в 0 или 1,
задача в общем-то тривиальная, но сейчас сижу, читаю Вирта, и после прочтения главы о представлении данных
в памяти появилась идея следующей процедуры:

{Процедура устанавливает заданный бит в 0 или 1
Par - переменная в которой устанавливается указанный бит
BitNum - номер устанавливаемого бита
Val - устанавливаемое значение (0 или 1)
Если параметры BitNum и Val некорректны, то процедура ничего
не делает
}

procedure SetBit(var Par: integer; BitNum, Val: byte);
type
 TBitSet = set of 0..31;
var
 s: TBitSet;
begin
 if (BitNum > 31) or (Val > 1) then exit;
 s := TBitSet(Par);
 case Val of
   0: exclude(s, BitNum);
   1: include(s, BitNum);
 end;
 Par := integer(s)
end;


По моему проще уже некуда. И ведь работает.
Поделитесь какими-нибудь своими нестандартными решениями, интересно посмотреть...


← →
vrem   (2005-09-30 10:31) [1]

BitNum:=BitNum and 31;
val:=val and 1;
if val=1 then par:=par or (1 shl bitnum)
else par:=  par and not (1 shl bitnum);


← →
Unick2   (2005-09-30 10:40) [2]

val:=(par and (not (1 shl bitnum))) or (val shl bitnum)


← →
Unick2   (2005-09-30 10:42) [3]

ошибся
вот так правильно
par:=(par and (not (1 shl bitnum))) or (val shl bitnum)


← →
begin...end ©   (2005-09-30 11:03) [4]

procedure SetBit(var Par: Integer; BitNum: Integer; Val: Boolean);
asm
 TEST CL, CL
 JZ @@Reset
 BTS [EAX], EDX
 RET
@@Reset:
 BTR [EAX], EDX
end.


← →
CHES ©   (2005-09-30 14:27) [5]

Сенькс за ответы.
Протестировал скорость работы при помощи GpProfile

Места распределились след. образом:

1 Unick2
2 vrem
3 CHES

Разница между моим вариантом и вариантом vrem незначительна. Процедура от Unick2 заметно вырывается вперед.

Вариант предложенный begin...end протестировать не удалось, GpProfile криво работает с процедурами на ассемблере.


← →
Ega23 ©   (2005-09-30 14:30) [6]

Result := ((aValue and (not (1 shl BitNumber))) or ((ord(BitValue) and 1) shl BitNumber));


← →
CHES ©   (2005-09-30 15:06) [7]

> Ega23

Насколько я понял функция устанавливает бит, и при этом сбрасывает все остальные?

Похоже на вариант unick2, видимо это самый быстрый подход.



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.03 c
8-1117266368
MaFon
2005-05-28 11:46
2005.10.23
Здесь была тема про детектор движения.


5-1103884467
Anatoly
2004-12-24 13:34
2005.10.23
Сохранение не published-свойства компонента в dfm


3-1126016397
Drakosha
2005-09-06 18:19
2005.10.23
Найти дырки в таблице


2-1127846953
vvh
2005-09-27 22:49
2005.10.23
Базы данных и Интернет


14-1127730619
ANB
2005-09-26 14:30
2005.10.23
Где можно скачать компоненты под D7 для работы с BTRIEVE ?




   Наверх