产生组合数,位运算

* 功能:产生组合数,如从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);
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值