“时钟算术”/全等数学中的一个加法/减法函数?
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:哎呀,把%
和&
混淆了:)【参考方案4】:
我不确定你想表达什么,但我认为这可能是你想要的:
x = ( ((a + b) % M) + M ) % M;
这将计算a + b
模M
的共同余数;它总是产生一个数字[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
,要么用&0xff
(或等效的&255
)屏蔽它。
顺便说一句,不要听那些告诉你使用 % 而不是 & 的人。除非您非常小心地确保与 % 一起使用的表达式是 unsigned int
类型或更大的无符号类型,否则 % 将产生实际的除法/余数运算,而不仅仅是位掩码。人们总是把它搞砸,以为编译器会优化 % 的 2 次方,却没有意识到优化对于有符号类型是不可能的。
【讨论】:
以上是关于“时钟算术”/全等数学中的一个加法/减法函数?的主要内容,如果未能解决你的问题,请参考以下文章