C++ “中的一个加法/减法函数”;时钟算法“/全等数学?
我想以这种形式“混合”字符*数据:C++ “中的一个加法/减法函数”;时钟算法“/全等数学?,c++,c,algorithm,math,C++,C,Algorithm,Math,我想以这种形式“混合”字符*数据: source = (source + some_primary_number) % 256; --256行是因为我需要保持字符的范围 因此,我可以在两个函数中执行“混合”和“取消混合”——上面的实现用于混合,而这一个用于取消混合: source = source - some_primary_number; if ( source < 0) { source = 256 + source } source=source-一些主数字;
source = (source + some_primary_number) % 256;
--256行是因为我需要保持字符的范围
因此,我可以在两个函数中执行“混合”和“取消混合”——上面的实现用于混合,而这一个用于取消混合:
source = source - some_primary_number;
if ( source < 0)
{
source = 256 + source
}
source=source-一些主数字;
如果(源<0)
{
source=256+源
}
这当然有效。但是,是否有任何选项可以使用相同的功能进行混合和取消混合
我记得一些模糊的数学知识
你能帮我吗?
谢谢 我不完全确定这就是你的意思,但一般来说,在模运算中,减去特定的
x
与添加m-x
是相同的操作,其中m
是模(这里,256)
例如,如果你的“混合”加上47(mod 256),那么“混合”加上209(mod 256),因为209=256-47。你想要什么样的混合?混合/取消混合的预期用途是什么 从纯粹的角度来看,如果混合和取消混合可以用相同的函数和相同的主数完成,那么这意味着每个输出数正好与一个输入数配对 我可以把带有常数的异或看作是其自身逆函数的一个例子 通常需要不同的反混合(逆)函数 是否有任何选项可以使用相同的功能进行混合和取消混合
对于联X特派团,只需使用负数即可。这就是你想要的吗?我不确定你想要的是什么,但我想这可能是你想要的:
x = ( ((a + b) % M) + M ) % M;
这将计算a+b
模M
的公共余数;它总是产生一个数字[0..M)
它通过第一次计算
(a+b)工作%M,然后<代码> +M,以防它为负,然后<代码> %M再次。< /P> < P>你想做算术模256。C和C++支持用无符号算术,所以如果你投到<代码>无符号char */COD>你可以简单地做明显的数学运算。char
,一切都应该正常。(或者uint8\u t
如果您想更明确地说明大小,但是uint8\u t
无论如何都不能存在于char\u BIT!=8
的平台上。)
一个可能的陷阱是,如果您在表达式中使用source+blah
的值,而没有首先将其写回unsigned char
类型的变量。在这种情况下,由于整数提升,它很可能超出0-255的范围。如果需要这样做,则将加法的结果返回到无符号字符
或用&0xff
屏蔽它(或等效&255
)
顺便说一句,不要听别人说用%而不是&。除非你非常小心地确保你用%的表达式是
unsigned int
类型或更大的unsigned类型,否则,%将导致实际的除法/余数运算,而不仅仅是位屏蔽。人们总是把这搞得一团糟,认为编译器将以2的幂优化%并且没有意识到对有符号类型的优化是不可能的。为什么模数会改变?当然它对任何模数都适用。@Ben:哎呀,把%
和&
搞混了:)为什么不干脆(a+b+M)%M
?
x = ( ((a + b) % M) + M ) % M;