OberonCore
https://forum.oberoncore.ru/

Вопрос про тип SET
https://forum.oberoncore.ru/viewtopic.php?f=35&t=2066
Страница 1 из 2

Автор:  adva [ Среда, 18 Ноябрь, 2009 10:19 ]
Заголовок сообщения:  Вопрос про тип SET

Стыдно пожалуй такой вопрос задавать, но ни как уразуметь не могу.
Объясните пожалуйста на пальцах, что это за множество/целое такое, и почему ограничено 32 элементами? И как оно представлено битами (если представлено).

Автор:  adva [ Среда, 18 Ноябрь, 2009 10:29 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Вопрос про ограничение, не философский, если что :-)

Автор:  Info21 [ Среда, 18 Ноябрь, 2009 10:53 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Тип SET -- прежде всего средство работы с битами.
Но с битами обычно работают, когда нужно иметь несколько флажков для свойств -- свойство есть/или его нет.

Например, при обработке сообщения от клавиатуры:
там есть поле SET, с помощью которого сообщается, какие упр. клавиши были нажаты (Ctrl, Alt и т.п.).
Каждой упр. клавише назначено маленькое число (как бы номер).
Если это число есть в SET -- клавиша нажата.
Если нет -- нет.

Число есть в SET -- то, значит, бит с соотв. номером равен 1.
Если нет -- то 0.

Автор:  Info21 [ Среда, 18 Ноябрь, 2009 11:11 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Да, забыл сказать: в слове 32 бита, поэтому.
Будет 64 -- добавится LONGSET. Как есть LONGINT.

Автор:  adva [ Среда, 18 Ноябрь, 2009 11:17 ]
Заголовок сообщения:  Re: Вопрос про тип SET

а ограничение в 32, это потому что размерность 32 ?

И вообще, SET это целое это в 10чной системе, или в двоичной? Судя по тому что с битами, то в двоичной.
Но не пойму, если разрядность определяет количество элементов множества, то в множестве 00000000..FFFFFFFF гораздо больше элементов чем 32? Или имеются в виду элементы с одной единицей например 00000001 ?

Если не сложно, какой-нибудь не сложный пример из одного модуля. А то опять, примерно понимаю, в чем смысл, а как работать с этим, нет

Автор:  Александр Ильин [ Среда, 18 Ноябрь, 2009 11:29 ]
Заголовок сообщения:  Re: Вопрос про тип SET

adva писал(а):
Если не сложно, какой-нибудь не сложный пример из одного модуля. А то опять, примерно понимаю, в чем смысл, а как работать с этим, нет
Пример работы (чтобы запутать):
Допустим, есть i: INTEGER (0 <= i < 16).
Допустим, нужно прибавить к нему число 16.
Наивная реализация: i := i + 16;
Чуть более продвинутая: INC(i, 16);
Для настоящих хакеров: s: SET; s := BITS(i); INCL(s, 4); i := ORD(s);
Инструкция INCL(s, 4) равнозначна присваиванию s := s + {4};

Автор:  adva [ Среда, 18 Ноябрь, 2009 11:31 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Еще раз уточню:
Цитата:
Число есть в SET -- то, значит, бит с соотв. номером равен 1.


(для упрощения привожу не 32 бита)
Проверять можно только числа вида 00010000 или вида 00010001 тоже? Во втором случае я так понимаю, число в SET если в SET выставлены оба бита? Или правильнее MAX(SET) => 00010001 ?

Автор:  Александр Ильин [ Среда, 18 Ноябрь, 2009 11:33 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Каждый элемент множества (SET) - это степень двойки. Сумма степеней двойки от 0 до 31 = MAX (INTEGER).
Вы вообще с понятием множества знакомы? http://ru.wikipedia.org/wiki/Множество

Автор:  adva [ Среда, 18 Ноябрь, 2009 11:34 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Александр Ильин писал(а):
Пример работы (чтобы запутать)

цель достигнута :)

Автор:  Александр Ильин [ Среда, 18 Ноябрь, 2009 11:36 ]
Заголовок сообщения:  Re: Вопрос про тип SET

adva писал(а):
вида 00010001
Это вы написали множество {0, 4}. Если вернуться к моему запутывающему примеру выше, вы прибавили 16 к i = 1.

Автор:  Роман М. [ Среда, 18 Ноябрь, 2009 11:37 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Если я не ошибаюсь, тип SET имеет разные размеры в зависимости от архитектуры аппаратной части. В 32-битной оно имеет размер 32 бита (считай, состояний флажков).

Автор:  adva [ Среда, 18 Ноябрь, 2009 11:37 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Александр Ильин писал(а):
Каждый элемент множества (SET) - это степень двойки. Сумма степеней двойки от 0 до 31 = MAX (INTEGER).

Во, пожалуй этого и не хватало для понимания. Что такое множество, я представлял. Я не представлял, что такое конкретное множество SET , теперь вопрос разрешен. Спасибо

Автор:  Александр Ильин [ Среда, 18 Ноябрь, 2009 11:38 ]
Заголовок сообщения:  Re: Вопрос про тип SET

adva писал(а):
Александр Ильин писал(а):
Пример работы (чтобы запутать)

цель достигнута :)
16 = 2 в четвёртой степени, поэтому в множество добавляем {4}.

Автор:  Александр Ильин [ Среда, 18 Ноябрь, 2009 11:40 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Александр Ильин писал(а):
Сумма степеней двойки от 0 до 31 = MAX (INTEGER).
Ой, на самом деле 2*(MAX(INTEGER)+1). Я забыл, что INTEGER у нас со знаком.

Автор:  Сергей Губанов [ Среда, 18 Ноябрь, 2009 12:55 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Примеры:

{0..9} + {20..30} = {0..9, 20..30}

{0..9} + {5..9} = {0..9}
{0..9} - {5..9} = {0..4}
{0..9} * {5..9} = {5..9}
{0..9} / {5..9} = {0..4}

Автор:  Galkov [ Среда, 18 Ноябрь, 2009 15:14 ]
Заголовок сообщения:  Re: Вопрос про тип SET

BTW
Вообще-то, на PC обращение к битам (установить/снять/прочитать) не имеет ограничение в 32 (или 64) ...
Хоть 4 гига битов индексируй - это одна команда проца.

Автор:  Евгений Темиргалеев [ Среда, 18 Ноябрь, 2009 15:25 ]
Заголовок сообщения:  Re: Вопрос про тип SET

adva писал(а):
Александр Ильин писал(а):
Каждый элемент множества (SET) - это степень двойки. Сумма степеней двойки от 0 до 31 = MAX (INTEGER).

Во, пожалуй этого и не хватало для понимания. Что такое множество, я представлял. Я не представлял, что такое конкретное множество SET , теперь вопрос разрешен. Спасибо

Language Report писал(а):
10.3 Predeclared Procedures
Код:
Name   Argument type   Result type   Function
BITS(x)   INTEGER   SET   {i | ODD(x DIV 2^i)}
ORD(x)   SET   INTEGER   (SUM i: i IN x: 2^i)

Автор:  Евгений Темиргалеев [ Среда, 18 Ноябрь, 2009 15:37 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Galkov писал(а):
BTW
Вообще-то, на PC обращение к битам (установить/снять/прочитать) не имеет ограничение в 32 (или 64) ...
Хоть 4 гига битов индексируй - это одна команда проца.
Это только для включить элемент в множесто/исключить (проц. INCL, EXCL). Команды (AND, OR, XOR, NOT), которыми вычисляется * + / - только для маш. слова.

Автор:  hothing [ Среда, 18 Ноябрь, 2009 20:42 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Вдогонку:
SET - это множество (вроде списка) целых чисел. Размер множества - 32 элемента. Т.е. множство может содержать от 0 до 32 чисел.
Любое число входящее в множество не может быть больше 31.

Каждому числу соответсвует один бит в 32-битном слове (4 байта).
Например
s: SET;
s := {0}; (*взвели 0-ой бит, ORD(s) = 1*)
s := {5}; (*взвели 5-ый бит, ORD(s) = 32*)
s := {0, 5}; (*взвели 0-ой и 5-ый биты, ORD(s) = 33*)
s := {0, 1}; (*взвели 0-ой и 1-ый биты, ORD(s) = 3*)

Почему используется 32-битное слово? Помому-что:
1) Операции включения, пересечения и исключения множеств очень легко можно реализовать с помощью битовых операций над машинным словом;
2) На большинстве современных ЦПУ машинное слово занимает 32 бита.
Например, для i386:
{0,1, 2} + {2,3} = {0,1,2,3} транслируется в
Код:
MOV EAX, 0x7
MOV EBX, 0x6
OR   EAX, EBX

{0,1, 2} - {2,3} = {0,1} транслируется в
Код:
MOV EAX, 0x7
MOV ECX, EAX
MOV EBX, 0x6
AND  EAX, EBX
XOR  EAX, ECX

{0,1, 2} * {2,3} = {2} транслируется в
Код:
MOV EAX, 0x7
MOV EBX, 0x6
AND  EAX, EBX

Автор:  adva [ Четверг, 19 Ноябрь, 2009 07:55 ]
Заголовок сообщения:  Re: Вопрос про тип SET

Евгений Темиргалеев писал(а):
Language Report писал(а):
10.3 Predeclared Procedures
Код:
Name   Argument type   Result type   Function
BITS(x)   INTEGER   SET   {i | ODD(x DIV 2^i)}
ORD(x)   SET   INTEGER   (SUM i: i IN x: 2^i)

Ну если спросил, значит мне оказалось недостаточно этого описания без предварительной математической, или какой там еще подготовки, хотя я его и видел.

И кстати, не могу вспомнить, какая операция здесь по очередности первой должна быть:
x DIV 2^i

Могу поискать конечно и сам, это простой случай, но "лирическое" отступление:

Я не спорю, практически все, касающееся языка, можно извлечь из сведений по языку. Но только тому человеку, у которого есть спецподготовка, иначе эту спецподготовку приходится осуществлять самому, а если при этом, не знаешь где искать и что, то бывает очень сложно. Особенно вводят в ступор всякие математические обозначения, не понятно что обозначающие, но активно применяющиеся. Не всю же математику из-за них за раз перечитать, чтобы найти что и где. И многие учебники по программированию, которые казалось бы должны содержать в себе необходимые сведения (или хотя бы ссылки, где их можно почерпнуть, но не список литературы в конце, а именно по тексту, хотя бы при встрече в первый раз, а лучше бы в первый раз в новой теме, если темы мало связаны), я просто не понимал, поэтому прерывал их чтение. Из последних прочитанных, очень понравился рекомендованный здесь Свердлов , и стиль изложения доступный, и хоть вкратце охватывает касательные темы.
Другие из предложенных, к сожалению еще не успел посмотреть, может быть тоже хороши, но те уровень которых предназначен для только-только начинающих (описывающие понятия циклов, условий), кажутся уже пройденными, все таки какие-то основы информатики преподавались в не специализированном учебном заведении, и рад бы заново потратить на них время, вдруг что новое узнаю, но не всегда оно есть.
Вот заказал книгу, и боюсь, если Вирт всегда отличается краткостью, то возможно с ним будет такая же ситуация. С предыдущей версией Алгоритмов... вроде так и получилось, примеры оказались непонятными, только из-за математических обозначений, а времени их найти не оказалось, отложил на потом. Ну а теперь с нетерпением жду продолжения :)

Это я пожалуй обращаюсь, к тем, кто занимается на этом сайте написанием учебников.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/