Transforming Bitarray into to list of power of 2's

53 Views Asked by At

I am trying to conver Bitarray into an array of corresponding decimal values if the bit is 1. The code I write is below but i don't want to use for loop. Is there a way around to avoid loop?

int right = 15;
var b = new BitArray(new int[] { right });
var valueList = new List<int>();
for (int i = 0; i < rightList.Count; i++)
{
         if (b[i])
         {
             valueList.Add((int)Math.Pow(2, i));
          }
}
1

There are 1 best solutions below

0
JAlex On

Try copying the bits into an integer array directly.

    static void Main(string[] args)
    {
        var ba = new BitArray(new int[] { 15 });
        var array = new int[ba.Length / (8*sizeof(int))];
        ba.CopyTo(array, 0);
        Console.WriteLine(array);
    }

The resulting array contains the values you want.


You can create some extension methods to get the list of integers, or the list of bytes if you want.

    public static int[] GetIntegerValues(this BitArray bitArray)
    {
        var array = new int[bitArray.Length / (8 * sizeof(int))];
        bitArray.CopyTo(array, 0);
        return array;
    }
    public static byte[] GetByteValues(this BitArray bitArray)
    {
        var array = new byte[bitArray.Length / 8];
        bitArray.CopyTo(array, 0);
        return array;
    }

with some sample usage

    static void Main(string[] args)
    {
        var bits = new BitArray(new int[] { 15, int.MinValue, int.MaxValue });

        var int_array = bits.GetIntegerValues();
        var byte_array = bits.GetByteValues();

        Console.WriteLine(int_array);
        // {15, -2147483648, 2147483647}
        Console.WriteLine(byte_array);
        // {15,0,0,0, 0,0,0,128, 255,255,255,127}
    }