dividing system.collections.bitarray into sub bitarrays of 32 bits each

前端 未结 2 543
执念已碎
执念已碎 2021-01-25 03:34

I have searched in net but not getting exactly what I need. I have a bitarray of size 15,936. I need to divide this bit array into list of bitarrays , with each bit array having

相关标签:
2条回答
  • 2021-01-25 04:12

    The first that you want 32-bit values makes this pretty easy, because you can copy it to an int[], then create one BitArray per int, passing the data by creating a single-element int array:

    int[] values = new int[bigBitArray.Length / 32];
    bigBitArray.CopyTo(values, 0);
    var smallBitArrays = values.Select(v => new BitArray(new[] { v })).ToList();
    

    Or more efficiently, reusing the same int[] for each iteration:

    int[] values = new int[bigBitArray.Length / 32];
    bigBitArray.CopyTo(values, 0);
    // Reuse this on every iteration, to avoid creating more arrays than we need.
    // Somewhat ugly, but more efficient.
    int[] buffer = new int[1];
    var smallBitArrays = values.Select(v =>
    { 
        buffer[0] = v; 
        return new BitArray(buffer))
    }).ToList();
    

    If those give you the bit arrays in the opposite order to what you expect, just call Array.Reverse(values) after the CopyTo call.

    It's a pity that BitArray doesn't have a constructor taking an existing array, offset and count... that would make it significantly more efficient. (As would a "slice copy" operation, of course.)

    A more general purpose option would be to create an extension method precisely for that "slice copy" part:

    public static BitArray CopySlice(this BitArray source, int offset, int length)
    {
        // Urgh: no CopyTo which only copies part of the BitArray
        BitArray ret = new BitArray(length);
        for (int i = 0; i < length; i++)
        {
             ret[i] = source[offset + i];
        }
        return ret;
    }
    

    Then:

    var smallBitArrays = Enumerable
        .Range(0, bigBitArray.Length / 32)
        .Select(offset => bigBitArray.CopySlice(offset * 32, 32))
        .ToList();
    
    0 讨论(0)
  • 2021-01-25 04:15

    You can copy your bit array into an array of bytes, split that array into chunks and create new bit arrays:

    const int subArraySizeBits = 32;
    const int subArraySizeBytes = subArraySizeBits / 8;
    byte[] bitData = new byte[myBitArray.Length / subArraySizeBytes];
    myBitArray.CopyTo(bitData, 0);
    List<BitArray> result = new List<BitArray>();
    for (int index = 0; index < bitData.Length; index += subArraySizeBytes) {
        byte[] subData = new byte[subArraySizeBytes];
        Array.Copy(bitData, index * subArraySizeBytes, subData, 0, subArraySizeBytes);
        result.Add(new BitArray(subData));
    }
    
    0 讨论(0)
提交回复
热议问题