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 писал(а): Александр Ильин писал(а): Пример работы (чтобы запутать) цель достигнута :) |
Автор: | Александр Ильин [ Среда, 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 Это только для включить элемент в множесто/исключить (проц. INCL, EXCL). Команды (AND, OR, XOR, NOT), которыми вычисляется * + / - только для маш. слова.
Вообще-то, на PC обращение к битам (установить/снять/прочитать) не имеет ограничение в 32 (или 64) ... Хоть 4 гига битов индексируй - это одна команда проца. |
Автор: | 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/ |