Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.033 c
8-1117461661
nes
2005-05-30 18:01
2005.10.23
Проигрывание *.mp3 с ресурса


8-1117531654
Pahan07
2005-05-31 13:27
2005.10.23
Фильтрация шума


2-1128240507
kami
2005-10-02 12:08
2005.10.23
Свой Hint файла в Explorer-e


6-1120482867
sunsay
2005-07-04 17:14
2005.10.23
Как узнать сколько байт собирается мне (клиенту) передать сервер


14-1127922469
Kerk
2005-09-28 19:47
2005.10.23
Знатокам HTML/CSS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский