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

Вниз

Как проверить бит   Найти похожие ветки 

 
Eugene1501   (2009-07-02 18:06) [0]

Тупой вопрос, мозги уже не варят.
Как проверить в каком состоянии n-ый бит в байте?
Не получается использовать "and" для байтов.


 
Rouse_ ©   (2009-07-02 18:09) [1]

if Value shr "номера бита" and 1 = 1 then


 
Eugene1501   (2009-07-02 18:19) [2]

Блин, точно. Спасибо.


 
RWolf ©   (2009-07-02 18:46) [3]

Как так - не получается "and"?
if b and $80<>0 then ...


 
Юрий Зотов ©   (2009-07-02 19:01) [4]

> Rouse_ ©   (02.07.09 18:09) [1]

1. if Value shr "номер бита" and 1 = 1 then...
2. if Value shr "номер бита" and 1 <> 0 then...
3. if Boolean(Value shr "номер бита" and 1) then...
4. if BOOL(Value shr "номер бита") then...

Розыч, скажи, как ассемблерщик - что быстрее?
:o)

PS
Понятно, что зависит от компилятора, но если компилятор достаточно умен - то что быстрее?


 
Sha ©   (2009-07-02 19:15) [5]

> if b and $80<>0 then ..

это быстрее


 
Юрий Зотов ©   (2009-07-02 19:25) [6]

> Sha ©   (02.07.09 19:15) [5]

Само собой, но имелось в виду, что номер бита заранее неизвестен.


 
Sha ©   (2009-07-02 19:51) [7]

Тогда 2, т.к. сравнения с нулем не будет, а будет анализ флагов после вычисления  
if (Value shr "номер бита") and 1.
Если Value в памяти, возможно, чуть быстрее было бы
if Value and  (1 shl "номер бита")
Можно еще массив констант заюзать


 
Amoeba ©   (2009-07-02 20:18) [8]

function Q_BitTest(P: Pointer; Index: Integer): Boolean;
asm
       BT      [EAX],EDX
       SETC    AL
end;


 
Sha ©   (2009-07-02 20:21) [9]

Функция точно медленее будет


 
Юрий Зотов ©   (2009-07-02 21:13) [10]

> Sha ©   (02.07.09 19:51) [7]

При умном компиляторе (который дает тот же код, что и человек), ИМХО, должно быть так (чисто интуитивно):

1. if Value shr "номер бита" and 1 = 1 then...
shr, and, jne

2. if Value shr "номер бита" and 1 <> 0 then...
shr, and, jz (мне кажется, что это быстрее из-за jz вместо jne)

3. if Boolean(Value shr "номер бита" and 1) then...
То же самое, что и 2: shr, and, jz

4. if BOOL(Value shr "номер бита") then...
shr, jz

===========

Получается, что самое медленное - 1, самое быстрое - 4, а варианты 2 и 3 равнозначны. Я прав?


 
Юрий Зотов ©   (2009-07-02 21:24) [11]

Собственно, оно понятно, что человек (и умный компилятор) сразу напишет shr и jz - поэтому задачка из серии "как помогать (а не мешать) реальному компилятору с языка высокого уровня строить оптимальный код".


 
Sha ©   (2009-07-02 22:56) [12]

> Юрий Зотов ©   (02.07.09 21:13) [10]

1. if Value shr "номер бита" and 1 = 1 then...
тут умный компилятор должен применить shr, and, cmp, jne,
т.к. не может знать заранее что после and результат или 0 или 1,
иначе это уже не компилятор, а программописатель

2 почти самый быстрый самый быстрый вариант, т.к. без cmp или test.
 скорость выполнения условных переходов не зависит от анализируемых флагов, их количества и типа анализа (установлен флаг или сброшен).
вариант
Value and  (1 shl "номер бита")
иногда может быть чуть быстрее, т.к. чтение Value из памяти может быть совмещено с вычислением (1 shl "номер бита")  

3 аналогично 1, т.к. сначала мы просили вычислить, а потом посмотреть как на булевское и сравнить. Delphi такие вещи не совмещает.

4 я полагаю, имелось ввиду
if BOOL(Value shr "номер бита" and 1) then...
В этом случае - аналогично 3 и 1


 
Юрий Зотов ©   (2009-07-02 23:55) [13]

> Sha ©   (02.07.09 22:56) [12]

Спасибо. Это я себя проверял (последний раз писал на Асме еще под DOS).

В 3 и 4 я полагал, что флаг нуля будет выставлен (или сброшен) уже при вычислении выражения, поэтому можно обойтись без сравнения.


 
Anatoly Podgoretsky ©   (2009-07-03 08:59) [14]

> Eugene1501  (02.07.2009 18:06:00)  [0]

http://www.podgoretsky.com/Redir.aspx?id=137&DownloadFile=~/ddp/bits.aspx


 
Rouse_ ©   (2009-07-03 10:48) [15]


> Розыч, скажи, как ассемблерщик - что быстрее?

Быстрее будет вот так:


function QuickBitCheck1(const Value, BitPos: Integer): Boolean;
begin
 Result := Value shr BitPos and 1 <> 0;
end;


или еще немножко быстрее:

function QuickBitCheck2(const Value, BitPos: Integer): Boolean;
asm
 bt Value, BitPos
 setb al
end;


но естественно вызов функций будет сам по себе тормозить :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
15-1245995836
Ega23
2009-06-26 09:57
2009.08.30
Веб-дизайнеры есть?


15-1246084442
Student85236
2009-06-27 10:34
2009.08.30
Как жестко перегрузить Windows XP


2-1246608612
NIIL
2009-07-03 12:10
2009.08.30
TRegExp и парсинг HTML


2-1246192670
Guest___
2009-06-28 16:37
2009.08.30
Сравнить значение Мемо с заданым


2-1246543590
Eugene1501
2009-07-02 18:06
2009.08.30
Как проверить бит





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