эквивалентные выражения - PullRequest
2 голосов
/ 23 апреля 2011

Я пытаюсь найти эквивалентные выражения следующих уравнений, используя побитовые, сложения и / или вычитания.Я знаю, что должен быть ответ (который, кроме того, обобщает работу для любого модуля 2 ^ a-1, где a - степень 2), но по некоторым причинам я не могу понять, каково это отношение.

Исходные выражения:

x = n % (2^32-1);
c = (int)n / (2^32-1); // ints are 32-bit, but x, c, and n may have a greater number of bits

Моя процедура для первого выражения состояла в том, чтобы взять модуль 2 ^ 32, а затем попытаться определить разницу между двумя модулями.У меня проблемы с этой второй частью.

x = n & 0xFFFFFFFF + difference // how do I calculate difference?

Я знаю, что разница n%(2^32)-n%(2^32-1) является периодической (с периодом 2^32*(2^32-1)), и есть "всплеск", начинающийся с кратных2^32-1 и заканчивается 2^32. После каждого кратного 2^32 график различий уменьшается на 1 (надеюсь, мои описания имеют смысл)

Аналогично, второе выражение может быть рассчитано аналогичным образом:

c = n >> 32 + makeup // how do I calculate makeup?

Я думаю, что макияж постоянно увеличивается на 1 при значениях, кратных 2^32-1 (и уменьшается на 1 при значениях, кратных 2^32), хотя у меня возникают проблемы с выражением этой идеи в терминах доступных операторов.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2011

Вы можете использовать эти идентификационные данные:

n mod (x - 1) = (((n div x) mod (x - 1)) + ((n mod x) mod (x - 1))) mod (x - 1)
n div (x - 1) = (n div x) + (((n div x) + (n mod x)) div (x - 1))

Сначала прибывает из (ab+c) mod d = ((a mod d) (b mod d) + (c mod d)) mod d.

Второе происходит от расширения n = ax + b = a(x-1) + a + b при делении на x-1.

0 голосов
/ 24 апреля 2011

Думаю, я понял ответ на свой вопрос:

Сначала вычислите c, затем используйте результаты для вычисления x. Предполагается, что сравнение возвращает 1 для истины, 0 для ложных. Кроме того, все сдвиги - это логические сдвиги.

c = (n>>32) + ((t & 0xFFFFFFFF) >= (0xFFFFFFFF - (n>>32)))

x = (0xFFFFFFFE - (n & 0xFFFFFFFF) - ((c - (n>>32))<<32)-c) & 0xFFFFFFFF

edit: изменено x (нужно сохранить только младшие 32 бита, остальное - "мусор")

...