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

Вниз

Как объяснить следующий код ?   Найти похожие ветки 

 
массив   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.035 c
1-1094835977
Rimas
2004-09-10 21:06
2004.09.26
Свойства панели задач


1-1095136160
Faeton08
2004-09-14 08:29
2004.09.26
TPageControl


14-1094741251
Копир
2004-09-09 18:47
2004.09.26
Эй, иногородние, скоро Вас в Москву не пустят.


8-1088750197
maxistent
2004-07-02 10:36
2004.09.26
Поворот битмапа по/против часовой стрлк


4-1092708584
Александр1
2004-08-17 06:09
2004.09.26
Работа с дисками!