Установка последних N битов в массиве - PullRequest
2 голосов
/ 22 апреля 2010

Я уверен, что это довольно просто, однако у меня есть серьезный ментальный блок, поэтому мне нужна небольшая помощь здесь!

У меня есть массив из 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 ]

3 голосов
/ 22 апреля 2010

Без бит-фу в C #:

BitArray ba = new BitArray (originalIntArray);
for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
    ba.Set (i, randomValue);
1 голос
/ 22 апреля 2010

Когда вы XOR любых данных со случайными данными, результат случайный, поэтому вы можете сделать это:

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);
}

Обратите внимание, что это вызывает случайное количество раз больше, чем необходимо, но просто.

0 голосов
/ 22 апреля 2010

Int32 - 4 байта или 32 бита.
Итак, вам нужен последний int и 8 дополнительных битов.

int lastEightBitsMask = 0x000F + 1;
Случайный ранд = новый Случайный ();
arr [arr.Length - 1] = rand.Next ();
arr [arr.Length - 2] ^ = rand.Next (lastEightBitsMask);

Пояснение:
Модификация последнего элемента должна быть достаточно ясной - если вам нужны последние 40 бит, последние 32 бита включаются в это.
Модификация оставшихся восьми бит ограничена сверху 0x000F + 1, поскольку аргумент rand.Next является исключительной верхней границей, генерируемые случайные числа будут не более того. Остальные биты числа останутся прежними, так как 1 ^ 0 == 1 и 0 ^ 0 == 0.

0 голосов
/ 22 апреля 2010

В псевдо-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
...