OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:15

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Битовые операции
СообщениеДобавлено: Суббота, 31 Декабрь, 2016 09:16 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Столкнулся с тем, что нет перевода из INTEGER в SET. Это немного усложняет операции с битами. Становится все не так удобно.

Я работаю со шрифтами, которые задаются как массивы SET. Хочу внутри ячейки сдвинуть букву и наложить другой паттерн сверху.

Чтобы сдвинуть паттерн на 2 пикселя логично использовать оператор сдвига ASR. Это будет примерно так:
intletter[i] := ASR(ORD(letter[i]), 2)

Но нам пришлось перевести SET в INTEGER. И обратного пути уже нет. Поэтому дальше битовые операции приходится делать неудобно, путем хитрых вычислений.

Вот так мы добавим восемь пикселей (двоеточие)
INC(intletter[8], 1 + 2);
INC(intletter[9], 1 + 2);
INC(intletter[20], 1 + 2);
INC(intletter[21], 1 + 2)

Если бы возможно было в Обероне-07 перевести в SET обратно из INTEGER, то было бы удобнее
letter[8] := BITS(intletter[8]) + {0, 1};
letter[9] := BITS(intletter[9]) + {0, 1};
letter[20] := BITS(intletter[20]) + {0, 1};
letter[21] := BITS(intletter[21]) + {0, 1};

Но оператора BITS в Обероне-07 нет. Скорее всего это сделано, чтобы отвязаться в определении языка от разрядности...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Суббота, 31 Декабрь, 2016 12:20 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
А не от представления отрицательных чисел?

Не верится, что проблема серьёзная.
Почему не срабатывает SYSTEM?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Суббота, 31 Декабрь, 2016 13:59 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
То есть в Обероне-07, в отличие от Оберона-2, ORD(set) работает, преобразовывает SET в INTEGER. А наоборот, получается, нельзя. Несимметрично как-то.

Да, попробуйте SYSTEM.VAL(SET, int) — обычный способ для Оберона-2.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Воскресенье, 01 Январь, 2017 17:19 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Oleg N. Cher писал(а):
попробуйте SYSTEM.VAL(SET, int) — обычный способ для Оберона-2.


Это пробовал, но в компиляторе O7 при этом выдается сообщение "casting not allowed". Александр так задумал видимо для надежности.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Понедельник, 02 Январь, 2017 02:00 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 520
Откуда: Украина, Днепропетровская обл.
Та какая там надёжность, это же SYSTEMная возможность! Для микроконтроллеров важна и эффективность. Так что просим Александра реализовать SYSTEM.VAL

Что касается нашего Оберон-транслятора в Си, Ofront+, то он поддерживает функцию BITS. Очень полезная и хорошая функция (SYSTEM.VAL практически ни в одной реализации нельзя применять для описания констант, BITS можно). Кстати, поддержка её в трансляторе занимает буквально несколько строчек кода.

Я конечно люблю минимализм, но излишний... и когда смотрю на Оберон-07, ловлю себя на мыслях типа "этой фичи тут нет, потому что она до сих пор не понадобилась Вирту". Ведь и типа BYTE могло в нём не быть, хватило бы и INTEGER 32 бит, просто нужно было мэтру в его задачах обращаться к байтам, а, например, 64-битные вычисления его в тот момент не интересовали. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Суббота, 07 Январь, 2017 00:12 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 473
Откуда: KZ
SYSTEM.VAL работает, и всегда работало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции
СообщениеДобавлено: Среда, 18 Январь, 2017 17:53 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Oleg N. Cher писал(а):
Ведь и типа BYTE могло в нём не быть, хватило бы и INTEGER 32 бит, просто нужно было мэтру в его задачах обращаться к байтам, а, например, 64-битные вычисления его в тот момент не интересовали. ;-)

Вот именно. Почему он не использовал для этих целей библиотечную функцию? Или специальную системную?


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

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Alexander Shiryaev писал(а):
SYSTEM.VAL работает, и всегда работало.


Разобрался :) Я пытался преобразовать SET в BYTE, поэтому было сообщение "casting not allowed".

Вот такой пример компилируется O7 без проблем:
Код:
MODULE DemoVal;
   IMPORT SYSTEM;
   VAR int: INTEGER; set: SET;

   PROCEDURE Do*;
   BEGIN
      set :={2, 3, 4};
      int := ASR(ORD(set), 2);
      set := SYSTEM.VAL(SET, int);
   END Do;
END DemoVal.


Всем спасибо за обсуждение. Тему предлагаю считать закрытой. SYSTEM.VAL действительно вполне достаточно, так что BITS не требуется.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


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

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