C# 如何计算位图?

C# 如何计算位图?,c#,bitmap,computation,C#,Bitmap,Computation,我正在寻找一种方法来获取列表项的所有组合。 我想的是有一个二维数组,类似于位图 e、 g位[][]我的位图 例如,如果我的列表中有4项“A、B、C、D” 我希望我的位图像这样填充 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,

我正在寻找一种方法来获取列表项的所有组合。 我想的是有一个二维数组,类似于位图 e、 g位[][]我的位图

例如,如果我的列表中有4项“A、B、C、D” 我希望我的位图像这样填充

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
但是我如何编写一些C代码来填充位图呢? (注:我的列表可能有80到90个项目,而不是100到200个,刚刚确认)


谢谢,所以。。。只需从1数到15(=(2^n)-1),然后以二进制形式写入,可能使用移位操作

这对于小数字来说是明智的。。。但是很快就变大了。对于64个项目,您可以在长时间内建模,但这是18446744073709551615组合。。。提示:你永远不会,永远不会,永远不会循环那么远

对于小型案件:

int n = 4;
int max = 1 << n;
for (long val = 1; val < max; val++)
{
    long mask = 1 << (n - 1);
    for (int bit = 0; bit < n; bit++)
    {
        bool set = (val & mask) != 0;
        Console.Write(set ? "1 " : "0 ");
        mask >>= 1;
    }
    Console.WriteLine();
}
int n=4;
int max=1=1;
}
Console.WriteLine();
}

同意Marc Gravell的观点。你不能假装生成一个你描述的列表,然后收集你需要的元素。 我一直在做类似的事情,但我只需要所有组合的一个子集,所以我在列表生成过程中过滤我的元素。这样,每次递归迭代(我使用的是F#)都不会创建我已经知道的元素,这些元素最终将被丢弃

使用这种方法,我可以执行200个元素的变化,并得到有效结果的列表(我已经知道它不会太大…)


如果你感兴趣,你描述的问题是一个组合问题。C#

中有一篇很好的文章,我相信您不需要在内存中存储所有组合。 只需从所有零位的数组开始(第一个组合)。要获得下一个组合,只需将1添加到上一个组合的最后一位(这很容易实现操作)。等等 内存使用率低,最多支持20亿位数。:)

private void按钮1\u单击(对象发送者,事件参数e)
{
字符串[]项={“A”、“B”、“C”、“D”};
bool[]位=新bool[items.Length];
for(int i=0;ix))
{
listBox1.Items.Add(string.Join(“,”,getcomposition(Items,bits));
AddBit(位,位.长度-1);
}
}
公共字符串[]GetCombination(字符串[]项,布尔[]位)
{
列表组合=新列表();
for(int i=0;i
是否要枚举200位整数?这需要一段时间。你最好在太阳死后有一个计划…@Damien,大约是80到90,我刚刚确认了…@Paul,位图代表a,B,C的组合,D@shrimpy-即使是80或90岁,我也不认为这是可行的。(2^80)/8 = 151115727451828646838272. 你的机器上有那么多字节的内存吗(即使.NET可以寻址)?@Damien,嗯..看来你是对的。。不可能做到。。。
    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;
        }
    }