“时钟算术”/全等数学中的一个加法/减法函数?

Posted

技术标签:

【中文标题】“时钟算术”/全等数学中的一个加法/减法函数?【英文标题】: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 

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

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

你能帮帮我吗? 谢谢!

【问题讨论】:

【参考方案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 次方,却没有意识到优化对于有符号类型是不可能的。

【讨论】:

以上是关于“时钟算术”/全等数学中的一个加法/减法函数?的主要内容,如果未能解决你的问题,请参考以下文章

Julia - 数学运算

Java运算符

Python3中的算术运算符

大脑如何做算术?加减法都有专用神经元,符号文字都能激活同一组|Cell子刊...

计算机组成原理之算术逻辑单元

Java学习之运算符