Главная страница
    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-1246132501
Loginov Dmitry
2009-06-27 23:55
2009.08.30
DBF


4-1216031319
Dash Rendar
2008-07-14 14:28
2009.08.30
Как запустить свое приложение вместо проводника?


1-1213595605
ganda
2008-06-16 09:53
2009.08.30
DevEpress Grid + фильтрация


1-1212768112
San1712
2008-06-06 20:01
2009.08.30
Как передать данные в процедуру ?


15-1245862036
Nic
2009-06-24 20:47
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский