产生组合数,位运算

来源:互联网 发布:mac鼠标滚轮没反应 编辑:程序博客网 时间:2024/06/04 18:14
* 功能:产生组合数,如从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 stubGenerateConbinedNumber g = new GenerateConbinedNumber();g.choose14From28(4,8);}}


0 0
原创粉丝点击