Search code examples
c#bitmapcomputation

how to compute a bitmap?


I am looking for a way to get all combination of a list item. what i thinking is to have a two dimention array, similary to a bit map e.g bit[][] mybitmap;

for example if i have 4 item in my list "A, B, C, D" i want my bitmap to be populate like this

A  B  C  D

0, 0, 0, 1  --> D
0, 0, 1, 0  --> C
0, 0, 1, 1  --> C, D
0, 1, 0, 0  --> B
0, 1, 0, 1
0, 1, 1, 0
0, 1, 1, 1
1, 0, 0, 0
1, 0, 0, 1
1, 0, 1, 0
1, 0, 1, 1  --> A, C, D
1, 1, 0, 0
1, 1, 0, 1
1, 1, 1, 0
1, 1, 1, 1  --> A, B, C, D

but how can i write some C# code to populate my bit map? (PS: my list might have items around 80 to 90, not 100 to 200, just confirmed)

Thanks


Solution

  • I believe you don't need to store all combinations in memory. Just start from array with all zero bits (first combination). To get next combination just add 1 to last bit of previous combination (it is easily implementing operation). And so on. Low memory usage, support of up to 2 billions of digits. :)

        private void button1_Click(object sender, EventArgs e)
        {
            string[] items = {"A", "B", "C", "D"};
            bool[] bits = new bool[items.Length];
            for (int i = 0; i < bits.Length; i++)
            {
                bits[i] = false;
            }
            while (!bits.All(x => x))
            {
                listBox1.Items.Add(string.Join(", ", GetCombination(items, bits)));
                AddBit(bits, bits.Length - 1);
            }
        }
    
        public string[] GetCombination(string[] items, bool[] bits)
        {
            List<string> combination = new List<string>();
            for (int i = 0; i < bits.Length; i++)
            {
                if (bits[i])
                {
                    combination.Add(items[i]);
                }
            }
            return combination.ToArray();
        }
    
        private void AddBit(bool[] bits, int pos)
        {
            if (pos < 0)
            {
                // overflow :)
                return;
            }
            if (bits[pos])
            {
                bits[pos] = false;
                AddBit(bits, pos - 1);
            }
            else
            {
                bits[pos] = true;
            }
        }