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. Вот, примерно, что получилось. ![]() Код: 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. Здесь я допустил характерную ошибку с размножением знака. ![]() Привожу исправленный вариант. Код: 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/ |