【问题标题】:One function for addition/subtraction in "Clock arithmetic"/congruent math?“时钟算术”/全等数学中的一个加法/减法函数?
【发布时间】:2010-06-29 08:49:18
【问题描述】:

我想以这种形式“混合” char* 数据:

source = (source + some_primary_number) % 256;

--256行是因为我需要保持char的范围。

所以我可以在 2 个函数中执行“混合”和“取消混合” - 上面的实现是用于混合,而这个是用于取消混合:

source  = source  - some_primary_number;
if ( source  < 0)
{
    source  = 256 + source 
}

这当然有效。但是是否有任何选项可以使用相同的功能进行混合和取消混合?

我记得一些与全等数学模糊的东西......

你能帮帮我吗? 谢谢!

【问题讨论】:

    标签: c++ c algorithm math


    【解决方案1】:

    我不完全确定这就是您的意思,但总的来说,在模算术中,减去特定的x 与添加m - x 的操作相同,其中m是模数(这里是 256)。

    例如,如果您的“混合”是添加 47(模 256),那么“取消混合”是添加 209(模 256),因为 209 = 256 - 47。

    【讨论】:

      【解决方案2】:

      您在寻找哪种混合方式?您对混合/取消混合的预期用途是什么?

      从纯粹的角度来看,如果混合和取消混合可以用相同的功能和相同的初级数来完成,那么这意味着每个输出数都与一个输入数配对。

      我可以将与常数的 XOR 视为其自身反函数的一个示例。

      Linear congruent generator 通常需要不同的解混(逆)函数。

      【讨论】:

        【解决方案3】:

        是否有任何选项可以使用相同的功能进行混合和取消混合?

        int foo(int source, int some_primary_number)
        {
            return (source + some_primary_number) & 255;
        }
        

        要取消混合,只需用负数调用它。这是你要求的吗?

        【讨论】:

        • 为什么模数会改变?当然,它适用于任何模数。
        • @Ben:哎呀,把%&amp; 混淆了:)
        【解决方案4】:

        我不确定你想表达什么,但我认为这可能是你想要的:

        x = ( ((a + b) % M) + M ) % M;
        

        这将计算a + bM 的共同余数;它总是产生一个数字[0..M)

        首先计算(a + b) % M,然后计算+ M,以防万一它是负数,然后再次计算% M

        【讨论】:

        • 为什么不只是( a + b + M ) % M
        【解决方案5】:

        您似乎想要进行模 256 的算术运算。C 和 C++ 支持无符号算术,因此如果您转换为 unsigned char *,您可以简单地进行明显的数学运算。

        【讨论】:

          【解决方案6】:

          如果您声明 source 的类型为 unsigned char,那么一切都应该正常工作。 (或者uint8_t,如果您想更明确地了解大小,但uint8_t 不能存在于CHAR_BIT!=8 的平台上。)

          一个可能的陷阱是,如果您在表达式中使用source+blah 的值,而没有先将其写回到unsigned char 类型的变量中。在这种情况下,由于整数提升,它很可能在 0-255 范围之外。如果你需要这样做,要么将加法的结果返回到unsigned char,要么用&amp;0xff(或等效的&amp;255)屏蔽它。

          顺便说一句,不要听那些告诉你使用 % 而不是 & 的人。除非您非常小心地确保与 % 一起使用的表达式是 unsigned int 类型或更大的无符号类型,否则 % 将产生实际的除法/余数运算,而不仅仅是位掩码。人们总是把它搞砸,以为编译器会优化 % 的 2 次方,却没有意识到优化对于有符号类型是不可能的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-19
            • 2016-07-23
            • 2019-03-18
            相关资源
            最近更新 更多