【问题标题】:equivalent expressions等价表达
【发布时间】:2011-04-23 15:31:26
【问题描述】:

我正在尝试使用按位、加法和/或减法运算符找出以下等式的等效表达式。我知道假设有一个答案(它进一步推广到任何模数 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?

我认为构成在 2^32-1 的倍数处稳步增加 1(在 2^32 的倍数处减少 1),尽管我在用可用的运算符表达这个想法时遇到了麻烦。

【问题讨论】:

    标签: math bitwise-operators modulo


    【解决方案1】:

    您可以使用这些身份:

    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

    【讨论】:

      【解决方案2】:

      我想我已经找到了问题的答案:

      首先计算 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位,其余为“垃圾”)

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 2019-11-29
        • 1970-01-01
        • 2021-11-29
        • 2011-02-27
        • 2014-01-21
        • 2012-01-07
        • 2019-07-25
        • 2020-12-19
        相关资源
        最近更新 更多