Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “中的一个加法/减法函数”;时钟算法“/全等数学?_C++_C_Algorithm_Math - Fatal编程技术网

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;