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

时间:2010-06-29 08:49:18

标签: c++ c algorithm math

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

source = (source + some_primary_number) % 256;

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

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

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

当然,这是有效的。但有没有选择混合和不混合相同的功能?

我记得有些模糊的数学......

你能帮帮我吗? 谢谢!

6 个答案:

答案 0 :(得分:2)

我不完全确定这是你的意思,但一般来说,在模块算术中,减去特定的x与添加m - x的操作相同,其中m是模数(此处为256)。

因此,例如,如果你的'混合'正在添加47(mod 256),那么'unmixing'正在添加209(mod 256),因为209 = 256 - 47。

答案 1 :(得分:1)

您在寻找什么样的混音?您对混合/非混合的用途是什么?

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

我可以将常数视为一个常数作为其自身反函数的一个例子。

Linear congruent generator通常需要不同的非混合(反向)函数。

答案 2 :(得分:0)

  

是否可以选择使用相同的功能进行混合和取消混音?

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

要取消混音,只需使用负数调用即可。那是你要的吗?

答案 3 :(得分:0)

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

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

这将计算a + b modulo M的公共残差;它总是会产生一个数字[0..M)

首先计算(a + b) % M,然后计算+ M,以防它是否定的,然后再计算% M

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您声明sourceunsigned char类型,那么一切都应该有用。 (或uint8_t如果您想更明确地了解尺寸,但uint8_t无法在CHAR_BIT!=8的平台上存在。)

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

顺便说一句,不要听那些告诉你使用%而不是&amp;的人。除非您非常小心地确保使用%的表达式是unsigned int类型或更大的无符号类型,否则%将产生实际的除法/余数运算,而不是仅仅进行位屏蔽。人们总是把它弄得一团糟,认为编译器会以2的幂来优化%,并且没有意识到签名类型的优化是不可能的。