OberonCore
https://forum.oberoncore.ru/

Битовые операции
https://forum.oberoncore.ru/viewtopic.php?f=115&t=5989
Страница 1 из 1

Автор:  Иван Денисов [ Суббота, 31 Декабрь, 2016 09:16 ]
Заголовок сообщения:  Битовые операции

Столкнулся с тем, что нет перевода из 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 нет. Скорее всего это сделано, чтобы отвязаться в определении языка от разрядности...

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

А не от представления отрицательных чисел?

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

Автор:  Oleg N. Cher [ Суббота, 31 Декабрь, 2016 13:59 ]
Заголовок сообщения:  Re: Битовые операции

То есть в Обероне-07, в отличие от Оберона-2, ORD(set) работает, преобразовывает SET в INTEGER. А наоборот, получается, нельзя. Несимметрично как-то.

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

Автор:  Иван Денисов [ Воскресенье, 01 Январь, 2017 17:19 ]
Заголовок сообщения:  Re: Битовые операции

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


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

Автор:  Oleg N. Cher [ Понедельник, 02 Январь, 2017 02:00 ]
Заголовок сообщения:  Re: Битовые операции

Та какая там надёжность, это же SYSTEMная возможность! Для микроконтроллеров важна и эффективность. Так что просим Александра реализовать SYSTEM.VAL

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

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

Автор:  Alexander Shiryaev [ Суббота, 07 Январь, 2017 00:12 ]
Заголовок сообщения:  Re: Битовые операции

SYSTEM.VAL работает, и всегда работало.

Автор:  Роман М. [ Среда, 18 Январь, 2017 17:53 ]
Заголовок сообщения:  Re: Битовые операции

Oleg N. Cher писал(а):
Ведь и типа BYTE могло в нём не быть, хватило бы и INTEGER 32 бит, просто нужно было мэтру в его задачах обращаться к байтам, а, например, 64-битные вычисления его в тот момент не интересовали. ;-)

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

Автор:  Иван Денисов [ Среда, 18 Январь, 2017 18:11 ]
Заголовок сообщения:  Re: Битовые операции

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 не требуется.

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