Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизКак объяснить следующий код ? Найти похожие ветки
← →
массив (2004-09-07 01:13) [0]
type
PByteSet = ^TByteSet;
TByteSet = set of Byte;
var
W: Word;
...
{ если бит 3 в слове W установлен, тогда ... }
if 3 in PByteSet(@W)^ then ...
Что означает3 in PByteSet(@W)^
? Эти собака, галочка, по отдельности и в целом, что значат ?
← →
Sergey Kaminski © (2004-09-07 01:17) [1]лучше будет, если изучишь Language Ref.
← →
Sergey Kaminski © (2004-09-07 01:17) [2]а то ведь следующим вопросом будет: "а что значит var"
← →
jack128 © (2004-09-07 01:18) [3]массив (07.09.04 1:13)
Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and w) <> 0 then
← →
массив (2004-09-07 01:23) [4]
> jack128 © (07.09.04 01:18) [3]
> массив (07.09.04 1:13)
> Хак это..Не стоит так делать.. Лудше уж if ((1 shl 3) and
> w) <> 0 then
Наоброт, мне понравилась краткость и читаемость3 in PByteSet(@W)^
, в отличие от((1 shl 3) and w) <> 0
Поэтому хочу её лучше понять. Кто-нибудь может без выпендриваний, толково объяснить ?
← →
Sergey Kaminski © (2004-09-07 01:36) [5]Вместо того, чтобы восторгаться корявым вариантом с типизированным указателем и насильственным приведением к нему указателя на паременную, лучше потратить время с пользой и прочитать доку по языку, главы о этих самых указателях, сетах и прочем. Не так ли?
А заодно и об операциях с битами. Кстати у Подгорецкого толковая есть статья об этом. И тогда, я уверен, поймешь, почему вариант, приведенный jack128 и красив и достаточен.
← →
Sergey Kaminski © (2004-09-07 01:40) [6]Это я к тому, что для человека, знакомого с
1. Типизированными указателями
2. Сетами
3. Операциями с битами
приведенный тобой код полностью прозрачен и очевиден
← →
массив (2004-09-07 01:49) [7]
> Sergey Kaminski © (07.09.04 01:36) [5]
> А заодно и об операциях с битами. Кстати у Подгорецкого
> толковая есть статья об этом.
Про биты я и сам статью могу написать, только мне это ненадо.
Запись с битами выглядит нечитаемой ((1 shl 3) and w) <> 0, потому, что глядя на неё надо задуматься, что она означает. А в случае 3 in PByteSet(@W)^ всё понятно сразу.
> Это я к тому, что для человека, знакомого с
> 1. Типизированными указателями
> 2. Сетами
Интуитивно тут и так понятно, что проверяется установка бита. А интересует толковое словесное объясниние, того как это происходит.
Кто-нибудь может объяснить без выпендриваний ?
← →
Sergey Kaminski © (2004-09-07 01:56) [8]А в случае 3 in PByteSet(@W)^ всё понятно сразу.
Ну так если понятно, что объяснять-то?
← →
Defunct © (2004-09-07 03:15) [9]> Что означает 3 in PByteSet(@W)^ ? Эти собака, галочка, по отдельности и в целом, что значат ?
Означает, что если у вас много таких сравнений, то программа будет очень сильно тормозить.
in работает очень медленно.
хотите нормальную скорость, создайте поразрядный массив масок.
ZMasks : Array[0..15] of Word = ($0001, $0002, $0004 $0008, $0010 и т.д.)
надо проверить 3-й бит, проверяйте:
If W and ZMasks(3)=1 Then ...
Else ...
← →
Sergey Kaminski © (2004-09-07 03:31) [10]Да нет, ничего оно тормозить не будет. Все сведется к
asm
test byte ptr [eax],const
end;
абсолютно точно также как и в случае
((1 shl 3) and w)
причем, маска высчитается еще на этапе компиляции и заранее их считать, в общем случае, нет необходимости.
← →
Defunct © (2004-09-07 04:00) [11]Sergey Kaminski © (07.09.04 03:31) [10]
вы что считаете, что там в сравнении всегда будет цифра 3?
А если там будет переменная?
Var X:Byte;
if X in PByteSet(@W)^ then
Вот какой код я вижу при выполнении сравнения с переменной (с включенной оптимизацией:push ebp ; - это можно опустить
mov ebp,esp ; - это тоже не всчет
push ecx
mov [ebp-$01],al
mov eax, @W^
mov dl,[ebp-$01]
and edx,$FF
bt [eax],edx
jnb <To Else>
Как видите здесь медленная команда bt, и 3 обращения к стеку. А когда мы сами создадим массив масок, команда test гарантирована, независимо от того как мы будем задавать номер бита: константой или переменной.
Случай с 1 shl 3.. тоже добавит нам лишний сдвиг если на месте "3" будет переменная. Создать массив масок не так уж и сложно, а ускоряет работу процентов на 30-40% специально тестировали.
← →
Sergey Kaminski © (2004-09-07 04:47) [12]Defunct © (07.09.04 04:00) [11]
Разумеется, я комментировал только приведенный код, в котором индекс тестируемого бита известен на этапе компиляции.bt
выполняется медленнееtest
где-то в 3 раза, так что верю и насчет 30-40%.
← →
Digitman © (2004-09-07 08:17) [13]
> массив (07.09.04 01:13)
PByteSet(@W)^ для компилятора означает : взять адрес (@) переменной W и рассматривать его как указатель (PByteSet) на данные типа TByteSet
← →
DiamondShark © (2004-09-07 08:39) [14]Оппа... А с чего это word приводится к set of byte?
Размер set of byte -- 256 бит = 32 байт.
Если уж работать с word, то тогда set of 0..15
← →
Verg © (2004-09-07 08:45) [15]
> А с чего это word приводится к set of byte?
Там приводятся указатели на ...( word к set of byte )
← →
массив (2004-09-08 06:17) [16]
> Digitman © (07.09.04 08:17) [13]
>
> > массив (07.09.04 01:13)
>
>
> PByteSet(@W)^ для компилятора означает : взять адрес (@)
> переменной W и рассматривать его как указатель (PByteSet)
> на данные типа TByteSet
А что означает галочка (^) в конце ? Зачем она ?
Нашёл в исходниках в модуле TypInfo.pas ещё интересную запись :
PropInfo^.PropType^^.Kind
Тут две галочки подряд. Адрес адреса ? Или что это ?
← →
Defunct © (2004-09-08 06:45) [17]> А что означает галочка (^) в конце ? Зачем она ?
^ - то что под указателем, другими словами - данные на которые указывает указатель.
Var P : PInteger;
I : Integer;
P := @I;
I := 1000; тоже самое, что и P^ := 1000;
← →
массив (2004-09-08 06:54) [18]
> ^ - то что под указателем, другими словами - данные на которые
> указывает указатель.
Ну так есть же уже PByteSet, зачем же ещё галочка ?
PByteSet(@W)^
А две галочки подряд зачем ?
← →
Defunct © (2004-09-08 07:04) [19]> Ну так есть же уже PByteSet, зачем же ещё галочка ?
PByteSet = ^TByteSet
> А две галочки подряд зачем ?
Значит был указатель на указатель на данные.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c