OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 09:24

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 18 Март, 2010 12:35 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Используя тип SET, как известно, можно производить различные битовые операции над целыми числами. Имея 32-битное число, нет никаких проблем производить над ним всякие манипуляции с помощью функций BITS и ORD.
Например:
Код:
PROCEDURE BitwiseAnd (a, b: INTEGER): INTEGER;
   VAR x, y: SET;
BEGIN
   x := BITS(a); y := BITS(b);
   RETURN ORD(x * y)  (* a AND b *)
END BitwiseAnd;


Однако, с 64-битными уже есть проблема:
Код:
PROCEDURE BitwiseAndL (a, b: LONGINT): LONGINT;
   VAR x, y: SET;
BEGIN
   x := BITS(a); y := BITS(b);
   RETURN ORD(x * y)  (* a AND b *)
END BitwiseAndL;

ибо упираемся в ограничение 32-битного слова.

Вопрос таков: есть ли какой-нибудь простой способ произвести битовые операции над 64-битными числами, не используя магический SYSTEM?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 18 Март, 2010 13:04 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Можно.
Кроме ORD и BITS надо использовать сдвиг ASH и MOD.

P.S. Лучше ASH, SHORT и LONG.
Вот, примерно, что получилось. :roll:
Код:
   PROCEDURE Or64(a, b: LONGINT) : LONGINT;
   BEGIN
      RETURN LONG(ORD(BITS(SHORT(a)) + BITS(SHORT(b))))
         + ASH(LONG(ORD(BITS(SHORT(ASH(a,-32))) + BITS(SHORT(ASH(b,-32))))), 32)
   END Or64;

P.P.S. Здесь я допустил характерную ошибку с размножением знака. :oops:
Привожу исправленный вариант.
Код:
   PROCEDURE Or64(a, b: LONGINT) : LONGINT;
   BEGIN
      RETURN ORD(BITS(SHORT(a)) + BITS(SHORT(b))) MOD 100000000L
         + ASH(LONG(ORD(BITS(SHORT(ASH(a,-32))) + BITS(SHORT(ASH(b,-32))))), 32)
   END Or64;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 20 Март, 2010 10:44 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Роман М. писал(а):
Например:
Код:
PROCEDURE BitwiseAnd (a, b: INTEGER): INTEGER;
Это просто пример?... в смысле Вы ведь на практике эту функцию не используете?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 20 Март, 2010 12:34 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
На практике она нужна когда нужна битовая маска для числа. Сфер применения не так много, но тоже есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 20 Март, 2010 20:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Вы на практике пишете BitwiseAnd(x, y) или сразу ORD(BITS(x)*BITS(y))? я про это спрашивал...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 21 Март, 2010 16:27 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Пользуюсь функцией, т.к. её название яснее отражает назначение, да и короче в записи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Март, 2010 13:24 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
> Пользуюсь функцией

Скорость работы не важна?


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

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


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

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


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

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