Форум: "Начинающим";
Текущий архив: 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