Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




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


15-1246470296
@!!ex
2009-07-01 21:44
2009.08.30
Сколько стоит интернет?


15-1246307568
Юрий
2009-06-30 00:32
2009.08.30
С днем рождения ! 30 июня 2009 вторник


1-1213336156
Anton
2008-06-13 09:49
2009.08.30
отладка библиотеки


9-1182001225
Li-ion
2007-06-16 17:40
2009.08.30
Насчет графики