制定一个公式,将数组的索引转换为该索引处的ement(byte)

问题描述 投票:0回答:1

需要使用AND AND XOR NEG SHIFT NOT等算法来创建算法(公式,函数),该算法根据索引来计算数组的元素,元素的大小是一个字节例如element = index^constant其中常数为array[index]^index(先前计算)。仅在数组大小小于256的情况下才有效。当索引大于1个字节时,如何从索引中生成一个字节。

arrays algorithm bit-manipulation bitwise-operators bit-shift
1个回答
1
投票

但是,由于您在BYTE中只有256个可能的数字,因此将存在重复,因此如果您的数组大于256,则必须存在重复。

为了避免明显的镜像,例如,您不能使用单调函数

value[ix] = ix

是单调的,因此将被视为类似于每256个字节镜像数组内容的形状。为了避免这种情况,您需要将更多的东西组合在一起。它类似于计算自己的伪随机生成器。常用方法是:

  1. 模块化算术

    类似:

    value[ix]=( ( c0*ix + c1*ix*ix + c2*ix*ix*ix )%prime )&255
    

    如果常量c0,c1,c2prime足够大,则输出看起来是随机的,因此在输出中可见的重复模式会少得多……但是您需要使用可以容纳质数的位宽算法...] >

    如果您达到算术位宽的上限,则需要使用modmul,modpow以避免溢出。参见:

  2. 交换位

  3. 只需在ix上做一些数学运算,在此您还使用带有交换位的ix。这将极大地改变单调性...这种方法最有效,但是在累积子结果上却不然,这不是您的情况。我会尝试:

    value[ix]=( ix + ((ix<<3)*5) - ((ix>>2)*7) + ((3*ix)^((ix<<4)||(ix>>4))) )&255
    

    使用常数和运算符可以达到不同的结果。但是,使用这种方法时,您需要检查有效性(我没有!)。因此,绘制前几个值(例如1024)的图形,其中x轴为ixy轴为value[ix]。在那里,您应该查看填充物是否在重复或什至向某个值饱和,并且是否改变了方程。

    有关更多信息,请参见How to seed to generate random numbers?

    毕竟这不可能从ix中获得value[ix] ...

© www.soinside.com 2019 - 2024. All rights reserved.