注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

如何判定一个数是否为2的N次方  

2013-12-20 17:41:51|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
如何判定一个数是否为2的N次方,
场景,一个数字字段按位保存 每种类型,如1,2,4,8,16等。
查询的时候数据库需要某种类型,按位与sql不能走索引,所以,采用计算出所有的某位为某个数值的所有数值,in查询。

由于2的N次方的数二进制表示是第1位为1,其余为0,而x-1(假如x为2的N次方)得到的数的二进制表示恰恰是第1位为0,其余为1,两者相与,得到的结果就为0,否则结果肯定不为0。

/**
*
*/
package bit;

import java.util.ArrayList;
import java.util.List;

/**
* @author wanggang
* @version 2013年12月20日
*/
public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 2;
int max= 16;
List<Integer> l = getAll( a, 100);
System.out.println(l);

l = getAll( 1, 100);
System.out.println(l);
}
/**
*
* @param a 标识位
* @param max 最大数值
* @return
*/
public static List<Integer> getAll(int a,int max){
if(a< 1 || !((a & (a-1)) == 0)){
throw new IllegalArgumentException();
}
List<Integer> list = new ArrayList<Integer>();
for( int i = 0; i<= max ;i++){
if((a & i) == a){
list.add(i);
}
}
return list;
}

}


执行结果
[2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31, 34, 35, 38, 39, 42, 43, 46, 47, 50, 51, 54, 55, 58, 59, 62, 63, 66, 67, 70, 71, 74, 75, 78, 79, 82, 83, 86, 87, 90, 91, 94, 95, 98, 99]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
统计信息唧唧歪歪唧唧网ggyygg.net
  评论这张
 
阅读(498)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016