C# 有没有人知道从2的0次方到2的9次方的和有多少种组合?又或者…解决方法

C# 有没有人知道从2的0次方到2的9次方的和有多少种组合?又或者……
有没有人知道从2的0次方到2的9次方的和有多少种组合?
如:7=1+2+4;19=1+2+6;27=1+2+8+16……

又或者有没有人有办法帮我解决下面这个问题:

我定义了一个枚举类:public enum FileType : int
  {
  xml = 1,
  eml = 2,
  doc = 4,
  docx = 8,
  xls =16,
  xlsx = 32,
  txt = 64,
  pdf = 128,
  rar = 256,
  zip = 512,
  }
程序监控一个指定目录,用户来选择该目录需要发送的文件类型,选中的类型会被发送(有可能是多选),其他类型文件程序不会动。

界面上用了十个checkbox,又定义了 int FTvalue = 0;//配置文件中存储文件类型选择结果的值
  int xmlValue = 0; //未选中时为0,选中时为(int)FileType.xml
  int emlValue = 0;
  int docValue = 0;
  int docxValue = 0;
  int xlsValue = 0;
  int xlsxValue = 0;
  int txtValue = 0;
  int pdfValue = 0;
  int rarValue = 0;
  int zipValue = 0;

FTvalue为上面十个变量的和,我现在的问题是,如何由FTvalue的值来判断哪些checkbox被选中了,或者说用户需要发送哪些类型,然后直接决定发送与不发送。而不是去统计这十个checkbox的checkstate

我说明白了吗?

------解决方案--------------------
2^9 - 1种,如果至少要选1个的话
------解决方案--------------------
这不就是一个排列组合的问题吗 一共是10个数 组合就是C10 0 C10 1 C10 2一直加到C10 10
学过高中数学的我们都知道问题的答案是2的10次方 给你说个方法 穷举所有结果
一个嵌套的FOR循环就可以了,当然你也可以采用递归的思想 最近刚写一个比你这个复杂点的算法 下面的几行是添加数据信息的 你这个只有数据下面的可以忽略。

for (int i = 1; i < 1 << x; i++)//从1循环到2^N
{
int sum = 0;
string temp = "";
for ( int j = 0; j < x; j++)
{

if ((i & 1 << j) != 0)//用i与2^j进行位与运算,若结果不为0,则表示第j位不为0,从数组中取出第j个数
{
sum += strClass[j].Price;
temp += strClass[j].Id.ToString() + " " + strClass[j].BookName + " " + strClass[j].BookClass + " " + strClass[j].Price.ToString() + " ";

}
}
if (sum == Int32.Parse(textBox.Text))
{
// MessageBox.Show(temp.TrimEnd('+'));//如果和为所求,则输出
string[] row = temp.Split(' ');
int n = row.Length / 4;
for (int m = 0; m < n; m++)
{

listView.Items.Add(new ListViewItem(new string[] { row[0 + m * 4], row[1 + m * 4], row[2 + m * 4], row[3 + m * 4] }));

/*listView.Items.Add(row[0 + m * 4]);
listView.Items.Add(row[1 + m * 4]);
listView.Items.Add(row[2 + m * 4]);
listView.Items.Add(row[3 + m * 4]);*/
/*listView.Items[m].SubItems[0].Text = row[0 + m * 4];
listView.Items[m].SubItems[1].Text = row[1 + m * 4];
listView.Items[m].SubItems[2].Text = row[2 + m * 4];
listView.Items[m].SubItems[3].Text = row[3 + m * 4];*/
}
------解决方案--------------------
先给枚举打上个[Flags]标记,然后就可以使用Enum类的HasFlag来判定是否标记某个特定的位。
比如控件chkDoc是一个CheckBox,那么可以
chkDoc.Checked = ((FileType)FTValue).HasFlag(FileType.doc);
------解决方案--------------------
和排列组合有个p关系, 这是最基础的“位运算”
每个文件类型实际上就占据了一个标志位而已