我希望以这种形式“混合”char *数据:
source = (source + some_primary_number) % 256;
- 256行是因为我需要保持char的范围。
所以我可以在2个函数中进行“混合”和“混合” - 上面的实现是用于混合,这个用于非混合:
source = source - some_primary_number;
if ( source < 0)
{
source = 256 + source
}
当然,这是有效的。但有没有选择混合和不混合相同的功能?
我记得有些模糊的数学......
你能帮帮我吗? 谢谢!答案 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)
如果您声明source
有unsigned char
类型,那么一切都应该有用。 (或uint8_t
如果您想更明确地了解尺寸,但uint8_t
无法在CHAR_BIT!=8
的平台上存在。)
一个可能的缺陷是,如果您在表达式中使用source+blah
的值而没有先将其写回unsigned char
类型的变量。在这种情况下,由于整数提升,它很可能在0-255的范围之外。如果您需要这样做,请将结果添加回unsigned char
或将其屏蔽&0xff
(或等效&255
)。
顺便说一句,不要听那些告诉你使用%而不是&amp;的人。除非您非常小心地确保使用%的表达式是unsigned int
类型或更大的无符号类型,否则%将产生实际的除法/余数运算,而不是仅仅进行位屏蔽。人们总是把它弄得一团糟,认为编译器会以2的幂来优化%,并且没有意识到签名类型的优化是不可能的。