* 功能:产生组合数,如从8里面选4个,输出形如11110000到00010111的结果
* 算法:二进制移位,与或非等
(以前写了个10选5的组合数,用解析字符串的方式来算,程序运行了几个小时才搞定,太低效了)
</pre><pre name="code" class="java">public class GenerateConbinedNumber {
/**
* @param args
* 功能:产生组合数,如从8里面选4个,输出形如11110000到00010111的结果
* 算法:二进制移位,与或非等
*/
public int nuberOf1(int number){
int count = 0;
int flag = 1;
int b;
/* //标签左移计算1的个数
* while(flag>0){
b = number&flag;
if(!(b==0))
count++;
flag = flag<<1;
//System.out.println(b);
}*/
//数右移位,计算1的个数
while(number>0){
b = number&flag;
if(!(b==0))
count++;
number = number>>1;
//flag = flag<<1;
//System.out.println(b);
}
return count;
}
public int nuberOf0(int number){
int count = 0;
int flag = 1;
int b;
while(number>0){
b = number&flag;
if(b==0)
count++;
number = number>>1;
}
return count;
}
public void choose14From28(int a,int b){
int aa = (int)Math.pow(2, a) - 1;
int bb = (int)Math.pow(2, b) - 1;
while(bb>aa){
if(this.nuberOf1(bb) == a){
System.out.println(this.write0(this.nuberOf1(bb), this.nuberOf0(bb), b) + Integer.toBinaryString(bb));
}
bb--;
}
}
public String write0(int n1,int n0, int n){
String s = "";
for(int i=0; i<n-n1-n0; i++){
s += "0";
}
return s;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
GenerateConbinedNumber g = new GenerateConbinedNumber();
g.choose14From28(4,8);
}
}