OberonCore
https://forum.oberoncore.ru/

Битовые операции над 64-битными числами
https://forum.oberoncore.ru/viewtopic.php?f=29&t=2453
Страница 1 из 1

Автор:  Роман М. [ Четверг, 18 Март, 2010 12:35 ]
Заголовок сообщения:  Битовые операции над 64-битными числами

Используя тип 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?

Автор:  AVC [ Четверг, 18 Март, 2010 13:04 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

Можно.
Кроме 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 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

Роман М. писал(а):
Например:
Код:
PROCEDURE BitwiseAnd (a, b: INTEGER): INTEGER;
Это просто пример?... в смысле Вы ведь на практике эту функцию не используете?

Автор:  Роман М. [ Суббота, 20 Март, 2010 12:34 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

На практике она нужна когда нужна битовая маска для числа. Сфер применения не так много, но тоже есть.

Автор:  Евгений Темиргалеев [ Суббота, 20 Март, 2010 20:10 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

Вы на практике пишете BitwiseAnd(x, y) или сразу ORD(BITS(x)*BITS(y))? я про это спрашивал...

Автор:  Роман М. [ Воскресенье, 21 Март, 2010 16:27 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

Пользуюсь функцией, т.к. её название яснее отражает назначение, да и короче в записи.

Автор:  Сергей Губанов [ Понедельник, 22 Март, 2010 13:24 ]
Заголовок сообщения:  Re: Битовые операции над 64-битными числами

> Пользуюсь функцией

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

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