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-дополнение и обратно. Отличная, отличная зарядка для моска. :) Механизм BITS в этой задаче оказался неудобным.

Автор:  Илья Ермаков [ Понедельник, 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.

Вот именно это мне и было нужно! :D Спасибо!

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