设置数组中的最后 N 位

发布于 2024-08-29 23:06:50 字数 319 浏览 5 评论 0原文

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

我有一个 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# 给出答案会加分

I'm sure this is fairly simple, however I have a major mental block on it, so I need a little help here!

I have an array of 5 integers, the array is already filled with some data. I want to set the last N bits of the array to be random noise.

[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]

This is largely language agnostic, but I'm working in C# so bonus points for answers in C#

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

听不够的曲调 2024-09-05 23:06:50

C# 中没有任何 bit-fu:

BitArray ba = new BitArray (originalIntArray);
for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
    ba.Set (i, randomValue);

Without any bit-fu in C#:

BitArray ba = new BitArray (originalIntArray);
for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
    ba.Set (i, randomValue);
鱼忆七猫命九 2024-09-05 23:06:50

当您将任何数据与随机数据进行异或时,结果是随机的,因此您可以执行以下操作:

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

请注意,这调用 random 的次数超出了必要的次数,但很简单。

When you XOR any data with random data, the result is random, so you can do this:

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;

For a general solution for any N you can use a loop:

for (int i = 0; i < 40; ++i)
{
    x[x.Length - i / 32 - 1] ^= random.Next(2) << (i % 32);
}

Note that this calls random more times than necessary, but is simple.

稚然 2024-09-05 23:06:50

在伪 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

In pseudo-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
小耗子 2024-09-05 23:06:50

Int32 是 4 个字节或 32 位。
所以你需要最后一个 int 和额外的 8 位。

int LastEightBitsMask = 0x000F + 1;
随机兰特 = new Random();
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。

Int32 is 4 bytes or 32 bits.
So you need the last int, and 8 bits extra.

int lastEightBitsMask = 0x000F + 1;
Random rand = new Random();
arr[arr.Length - 1] = rand.Next();
arr[arr.Length - 2] ^= rand.Next(lastEightBitsMask);

Explanation:
The last element's modification should be pretty clear - if you need the last 40 bits, the last 32 bits are included in that.
The remaining eight bits's modification is bounded above by 0x000F + 1, since rand.Next's argument is an exclusive upper bound, the randoms generated will be no more than that. The remaining bits of the number will stay the same, since 1^0 == 1 and 0^0 == 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文