Главная страница
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.043 c
1-1128105720
Volf_555
2005-09-30 22:42
2005.10.23
Проблема с временем


14-1128330574
Труп Васи Доброго
2005-10-03 13:09
2005.10.23
Затмение. Итересно!


2-1127885290
Andrey235
2005-09-28 09:28
2005.10.23
присоединение файла


11-1109735577
Денис
2005-03-02 06:52
2005.10.23
ComboBox и OnChar


9-1118348967
Cerberus
2005-06-10 00:29
2005.10.23
Вода