代码之家  ›  专栏  ›  技术社区  ›  Martin

设置数组中的最后n位

  •  2
  • Martin  · 技术社区  · 14 年前

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

    我有一个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 回复  |  直到 14 年前
        1
  •  3
  •   Foxfire    14 年前

    在c中没有一点fu:

    BitArray ba = new BitArray (originalIntArray);
    for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
        ba.Set (i, randomValue);
    
        2
  •  1
  •   Mark Byers    14 年前

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

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

    注意,这个调用随机的次数比需要的次数多,但很简单。

        3
  •  0
  •   doublep    14 年前

    在伪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
    
        4
  •  0
  •   Rubys    14 年前

    int32是4字节或32位。
    所以你需要最后一个整数,再加8位。

    int lasteightbitsmask=0x000f+1;
    random rand=new random();
    arr[arr.length-1]=rand.next();
    arr[arr.length-2]^=rand.next(最后八位掩码);

    说明:
    最后一个元素的修改应该非常清楚——如果您需要最后40位,那么最后32位包含在其中。
    由于rand.next的参数是一个排他上界,所以其余8位的修改在0x000f+1之上,生成的随机数不会超过这个值。数字的其余位将保持不变,因为1^0==1和0^0==0。