Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
8-1088624004
Gorilka
2004-06-30 23:33
2004.09.26
Из *.mid в *.mp3 или *.cda


14-1094326705
Knight
2004-09-04 23:38
2004.09.26
Есть функция для перекодировки русской темы письма...


14-1094542630
Lex
2004-09-07 11:37
2004.09.26
Есть ли тут кто из Томска?


3-1093525674
REA
2004-08-26 17:07
2004.09.26
Каскадное удаление дерева


14-1094693656
Думкин
2004-09-09 05:34
2004.09.26
С днем рождения! 9 сентября





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский