Главная страница
    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.46 MB
Время: 0.035 c
2-1127897200
gvv
2005-09-28 12:46
2005.10.23
Запись string-вой строки в текстовый файл


3-1126287172
Кабан
2005-09-09 21:32
2005.10.23
DBLocupLookupComboBox


14-1127915520
Juice
2005-09-28 17:52
2005.10.23
COM+Delphi="Гнилая" тема?


1-1128065748
SergProger
2005-09-30 11:35
2005.10.23
RAR - архивы


5-1103289733
Семен Сорокин
2004-12-17 16:22
2005.10.23
Работа с компонентом в Design-Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский