OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2019 16:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 10:19 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Стыдно пожалуй такой вопрос задавать, но ни как уразуметь не могу.
Объясните пожалуйста на пальцах, что это за множество/целое такое, и почему ограничено 32 элементами? И как оно представлено битами (если представлено).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 10:29 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Вопрос про ограничение, не философский, если что :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 10:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8061
Откуда: Троицк, Москва
Тип SET -- прежде всего средство работы с битами.
Но с битами обычно работают, когда нужно иметь несколько флажков для свойств -- свойство есть/или его нет.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8061
Откуда: Троицк, Москва
Да, забыл сказать: в слове 32 бита, поэтому.
Будет 64 -- добавится LONGSET. Как есть LONGINT.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:17 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
а ограничение в 32, это потому что размерность 32 ?

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:29 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2296
Откуда: Россия, Санкт-Петербург
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};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:31 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Еще раз уточню:
Цитата:
Число есть в SET -- то, значит, бит с соотв. номером равен 1.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:33 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2296
Откуда: Россия, Санкт-Петербург
Каждый элемент множества (SET) - это степень двойки. Сумма степеней двойки от 0 до 31 = MAX (INTEGER).
Вы вообще с понятием множества знакомы? http://ru.wikipedia.org/wiki/Множество


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:34 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Александр Ильин писал(а):
Пример работы (чтобы запутать)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:36 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2296
Откуда: Россия, Санкт-Петербург
adva писал(а):
вида 00010001
Это вы написали множество {0, 4}. Если вернуться к моему запутывающему примеру выше, вы прибавили 16 к i = 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Если я не ошибаюсь, тип SET имеет разные размеры в зависимости от архитектуры аппаратной части. В 32-битной оно имеет размер 32 бита (считай, состояний флажков).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:37 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Александр Ильин писал(а):
Каждый элемент множества (SET) - это степень двойки. Сумма степеней двойки от 0 до 31 = MAX (INTEGER).

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2296
Откуда: Россия, Санкт-Петербург
adva писал(а):
Александр Ильин писал(а):
Пример работы (чтобы запутать)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 11:40 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2296
Откуда: Россия, Санкт-Петербург
Александр Ильин писал(а):
Сумма степеней двойки от 0 до 31 = MAX (INTEGER).
Ой, на самом деле 2*(MAX(INTEGER)+1). Я забыл, что INTEGER у нас со знаком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 12:55 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Примеры:

{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}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 15:14 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
BTW
Вообще-то, на PC обращение к битам (установить/снять/прочитать) не имеет ограничение в 32 (или 64) ...
Хоть 4 гига битов индексируй - это одна команда проца.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 15:25 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
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)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 15:37 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Среда, 18 Ноябрь, 2009 20:42 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 205
Откуда: Austria, Bruck
Вдогонку:
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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос про тип SET
СообщениеДобавлено: Четверг, 19 Ноябрь, 2009 07:55 

Зарегистрирован: Суббота, 16 Февраль, 2008 07:58
Сообщения: 344
Откуда: Россия, Стерлитамак
Евгений Темиргалеев писал(а):
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

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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: kekc_leader и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB