我确信这很简单,但是我有一个重要的心理障碍,所以我需要一点帮助!
我有一个包含5个整数的数组,该数组已经填充了一些数据。我想将数组的最后N 位设置为随机噪声。
[int][int][int][int][int]
eg. set last 40 bits
[unchanged][unchanged][unchanged][24 bits of old data followed 8 bits of randomness][all random]
这在很大程度上与语言无关,但我在C#中工作,所以在C#中获得答案的奖励积分
答案 0 :(得分:3)
C#中没有任何bit-fu:
BitArray ba = new BitArray (originalIntArray);
for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
ba.Set (i, randomValue);
答案 1 :(得分:1)
当您使用随机数据对任何数据进行异或时,结果是随机的,因此您可以这样做:
Random random = new Random();
x[x.Length - 2] ^= random.Next(1 << 8);
x[x.Length - 1] = random.Next(1 << 16);
x[x.Length - 1] ^= random.Next(1 << 16) << 16;
对于任何N的一般解决方案,您可以使用循环:
for (int i = 0; i < 40; ++i)
{
x[x.Length - i / 32 - 1] ^= random.Next(2) << (i % 32);
}
请注意,这比随机调用的次数多,但很简单。
答案 2 :(得分:0)
在伪Python中:
N = 5 # array size
bits = 40 # for instance
int_bits = 32 # bits in one integer
i = N
while bits > 0:
value_bits = min (bits, int_bits)
bits -= value_bits
mask = (1 << value_bits) - 1
i -= 1
array[i] ^= random () & mask
答案 3 :(得分:0)
Int32是4个字节或32位 所以你需要最后一个int,另外还需要8位。
int lastEightBitsMask = 0x000F + 1;
随机rand = new Random();
arr [arr.Length - 1] = rand.Next();
arr [arr.Length - 2] ^ = rand.Next(lastEightBitsMask);
说明:
最后一个元素的修改应该非常清楚 - 如果你需要最后的40位,那么最后的32位包含在其中
其余8位的修改超出了0x000F + 1,因为rand.Next的参数是一个独占的上限,所生成的randoms将不会超过这个。数字的其余位将保持不变,因为1 ^ 0 == 1和0 ^ 0 == 0。