设置数组中的最后N位

时间:2010-04-21 23:18:11

标签: algorithm language-agnostic bit-manipulation bitfoo

我确信这很简单,但是我有一个重要的心理障碍,所以我需要一点帮助!

我有一个包含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#中获得答案的奖励积分

4 个答案:

答案 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。