Текущий архив: 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.46 MB
Время: 0.035 c