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/ |