OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 20:52

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Битовые операции.
СообщениеДобавлено: Воскресенье, 15 Февраль, 2009 11:51 

Зарегистрирован: Вторник, 13 Март, 2007 06:15
Сообщения: 93
Здравствуйте!
Скажте пожалуйста, как в ББ делаются побитовые операции?
Нужен аналог побитового сложения (2 | 3 - в Си, или 2 or 3 - в Делфи) и побитового умножения (2 & 3 - в Сях, или 2 and 3 - в делфях).
Уже, кажется, все возможные варианты перебрал, так и не нашёл. А очень надо. :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Воскресенье, 15 Февраль, 2009 12:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
BITS(x) трактует как SET.
Далее:
bwand ~ SET * SET (пересечение множеств бит)
bwor ~ SET + SET (объединение)
bwxor ~ SET / SET (симметрическая разность)

Обратная трактовка: ORD(set) как INTEGER.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Воскресенье, 15 Февраль, 2009 23:20 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Илья Ермаков писал(а):
...

Следующими на очереди - вопросы про преобразования целых во множества (и обратно), возмущение показанным выражением и воспоминания про Си... :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 00:21 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Когда мне понадобилось Base64 кодирование, то я поюзал BITS, в целом - неудобно.

Задача была такая, из 3 октетов сделать 4 сикстета битов вот так

{xxxxxxxx, yyyyyyyy, zzzzzzzz} -> {00xxxxxx, 00xxyyyy, 00yyyyzz, 00zzzzzz}

На входе 3 величины типа BYTE, на выходе 4 типа BYTE. Лучше всего, оно конечно логическим сдвигом раскидать. Но в ББ только арифметический, который для отрицательных байтов("дополнение", кажется) даёт неверный результат. тогда я попытался на BITS и SET'ах сделать свой логический сдвиг. Правда, SET работает с INTEGER, и я полдня убил на перевод INTEGER-дополнения в BYTE-дополнение и обратно. Отличная, отличная зарядка для моска. :) Механизм BITS в этой задаче оказался неудобным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 00:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В SYSTEM же есть обычный сдвиг!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 00:52 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Пётр Кушнир писал(а):
...

SYSTEM.LSH

О! Открыл страницу, пока раскачивался с ответом - Илья написал... :)


Последний раз редактировалось Wlad Понедельник, 16 Февраль, 2009 00:58, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 00:54 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Блин! :(
Я и не подумал, что он там может быть. Глянул в описании языка, а там нету. Ндааа...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 00:59 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Пётр Кушнир писал(а):
Блин! :(
Я и не подумал, что он там может быть. Глянул в описании языка, а там нету. Ндааа...

Ну, а если вам так важна "чистота" языка - можете ввести константные массивы SET масок, которые будете накладывать на результат арифметического сдвига для "нейтрализации" размножившегося знакового бита... Индекс в массиве масок как раз и будет задаваться величиной сдвига. Тока не забудьте, что в элементе по индексу 0 должны быть все единицы!... И элементов в таком массиве будет на 1 больше максимально возможного сдвига ( байт - 9, короткое целое - 17, целое - 33 )

ЗЫ Кстати, такие массивы масок я и в сишнык проектах применяю. Они у меня в мой собственный defs.h всегда входят.
Очень удобно иметь их и для левых и для правых сдвигов (или один "правосторнний", но его сдвигать "до упора" влево, если надо)... Кроме того, можно и сами значения масок двигать и получать нужные маски "в середине" исследуемой переменной. В последнем случае индекс становится длинной выделяемой или обнуляемой последовательности битов... Если позволяет память (а под виндой - естественно! :) ) можете создавать двумерный массив из таких масок. Тогда первым индексом будет номер бита, с которого надо наложить маску, а второй - количество маскируемых битов...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 01:15 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Владимир Лось писал(а):
Ну, а если вам так важна "чистота" языка - можете ввести константные массивы SET масок, которые будете накладывать на результат арифметического сдвига для "нейтрализации" размножившегося знакового бита... Индекс в массиве масок как раз и будет задаваться величиной сдвига.
Я решил, что логического сдвига просто нет. Ну, мало ли, динамических строк тоже нет. Но наверное, так надо - запихнуть его в SYSTEM.
Не более. Буду знать. :dumb:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Битовые операции.
СообщениеДобавлено: Понедельник, 16 Февраль, 2009 10:16 

Зарегистрирован: Вторник, 13 Март, 2007 06:15
Сообщения: 93
Илья Ермаков писал(а):
BITS(x) трактует как SET.
Далее:
bwand ~ SET * SET (пересечение множеств бит)
bwor ~ SET + SET (объединение)
bwxor ~ SET / SET (симметрическая разность)

Обратная трактовка: ORD(set) как INTEGER.

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


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

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


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

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


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

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