Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.039 c
4-1124138161
ronyn
2005-08-16 00:36
2005.10.23
Net Send по заданному адресу


2-1127841557
userrrrr
2005-09-27 21:19
2005.10.23
Как програмно изменит: Свойства обозревателя?


2-1127999970
Гарри Шалфеевичь
2005-09-29 17:19
2005.10.23
Как найти ПОСЛЕДНИЙ пробел в строке?


1-1128091535
shamansky
2005-09-30 18:45
2005.10.23
RoseDelphiLink-3.2.20041014


2-1128064493
MirsaID
2005-09-30 11:14
2005.10.23
Не могу подключатся базы Access через ADO