Я пытаюсь найти эквивалентные выражения следующих уравнений, используя побитовые, сложения и / или вычитания.Я знаю, что должен быть ответ (который, кроме того, обобщает работу для любого модуля 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
), хотя у меня возникают проблемы с выражением этой идеи в терминах доступных операторов.