OberonCore https://forum.oberoncore.ru/ |
|
Битовые операции. https://forum.oberoncore.ru/viewtopic.php?f=29&t=1355 |
Страница 1 из 1 |
Автор: | rv82 [ Воскресенье, 15 Февраль, 2009 11:51 ] |
Заголовок сообщения: | Битовые операции. |
Здравствуйте! Скажте пожалуйста, как в ББ делаются побитовые операции? Нужен аналог побитового сложения (2 | 3 - в Си, или 2 or 3 - в Делфи) и побитового умножения (2 & 3 - в Сях, или 2 and 3 - в делфях). Уже, кажется, все возможные варианты перебрал, так и не нашёл. А очень надо. ![]() |
Автор: | Илья Ермаков [ Воскресенье, 15 Февраль, 2009 12:15 ] |
Заголовок сообщения: | Re: Битовые операции. |
BITS(x) трактует как SET. Далее: bwand ~ SET * SET (пересечение множеств бит) bwor ~ SET + SET (объединение) bwxor ~ SET / SET (симметрическая разность) Обратная трактовка: ORD(set) как INTEGER. |
Автор: | Wlad [ Воскресенье, 15 Февраль, 2009 23:20 ] |
Заголовок сообщения: | Re: Битовые операции. |
Илья Ермаков писал(а): ... Следующими на очереди - вопросы про преобразования целых во множества (и обратно), возмущение показанным выражением и воспоминания про Си... ![]() |
Автор: | Пётр Кушнир [ Понедельник, 16 Февраль, 2009 00:21 ] |
Заголовок сообщения: | Re: Битовые операции. |
Когда мне понадобилось Base64 кодирование, то я поюзал BITS, в целом - неудобно. Задача была такая, из 3 октетов сделать 4 сикстета битов вот так {xxxxxxxx, yyyyyyyy, zzzzzzzz} -> {00xxxxxx, 00xxyyyy, 00yyyyzz, 00zzzzzz} На входе 3 величины типа BYTE, на выходе 4 типа BYTE. Лучше всего, оно конечно логическим сдвигом раскидать. Но в ББ только арифметический, который для отрицательных байтов("дополнение", кажется) даёт неверный результат. тогда я попытался на BITS и SET'ах сделать свой логический сдвиг. Правда, SET работает с INTEGER, и я полдня убил на перевод INTEGER-дополнения в BYTE-дополнение и обратно. Отличная, отличная зарядка для моска. ![]() |
Автор: | Илья Ермаков [ Понедельник, 16 Февраль, 2009 00:42 ] |
Заголовок сообщения: | Re: Битовые операции. |
В SYSTEM же есть обычный сдвиг! |
Автор: | Wlad [ Понедельник, 16 Февраль, 2009 00:52 ] |
Заголовок сообщения: | Re: Битовые операции. |
Пётр Кушнир писал(а): ... SYSTEM.LSH О! Открыл страницу, пока раскачивался с ответом - Илья написал... ![]() |
Автор: | Пётр Кушнир [ Понедельник, 16 Февраль, 2009 00:54 ] |
Заголовок сообщения: | Re: Битовые операции. |
Блин! ![]() Я и не подумал, что он там может быть. Глянул в описании языка, а там нету. Ндааа... |
Автор: | Wlad [ Понедельник, 16 Февраль, 2009 00:59 ] |
Заголовок сообщения: | Re: Битовые операции. |
Пётр Кушнир писал(а): Блин! ![]() Я и не подумал, что он там может быть. Глянул в описании языка, а там нету. Ндааа... Ну, а если вам так важна "чистота" языка - можете ввести константные массивы SET масок, которые будете накладывать на результат арифметического сдвига для "нейтрализации" размножившегося знакового бита... Индекс в массиве масок как раз и будет задаваться величиной сдвига. Тока не забудьте, что в элементе по индексу 0 должны быть все единицы!... И элементов в таком массиве будет на 1 больше максимально возможного сдвига ( байт - 9, короткое целое - 17, целое - 33 ) ЗЫ Кстати, такие массивы масок я и в сишнык проектах применяю. Они у меня в мой собственный defs.h всегда входят. Очень удобно иметь их и для левых и для правых сдвигов (или один "правосторнний", но его сдвигать "до упора" влево, если надо)... Кроме того, можно и сами значения масок двигать и получать нужные маски "в середине" исследуемой переменной. В последнем случае индекс становится длинной выделяемой или обнуляемой последовательности битов... Если позволяет память (а под виндой - естественно! ![]() |
Автор: | Пётр Кушнир [ Понедельник, 16 Февраль, 2009 01:15 ] |
Заголовок сообщения: | Re: Битовые операции. |
Владимир Лось писал(а): Ну, а если вам так важна "чистота" языка - можете ввести константные массивы SET масок, которые будете накладывать на результат арифметического сдвига для "нейтрализации" размножившегося знакового бита... Индекс в массиве масок как раз и будет задаваться величиной сдвига. Я решил, что логического сдвига просто нет. Ну, мало ли, динамических строк тоже нет. Но наверное, так надо - запихнуть его в SYSTEM. Не более. Буду знать. :dumb: |
Автор: | rv82 [ Понедельник, 16 Февраль, 2009 10:16 ] |
Заголовок сообщения: | Re: Битовые операции. |
Илья Ермаков писал(а): BITS(x) трактует как SET. Далее: bwand ~ SET * SET (пересечение множеств бит) bwor ~ SET + SET (объединение) bwxor ~ SET / SET (симметрическая разность) Обратная трактовка: ORD(set) как INTEGER. Вот именно это мне и было нужно! ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |