n&(n-1)的用途
n&(n-1)的用途
1,求一个int类型数是否为2的幂
当n=4时,二进制为:0100
n-1=3,二进制为:0011
则:n&(n-1)==0
当n=8时,为1000
n-1=7,为0111
则n&(n-1)==0
再举个反例:当n=5,为0101
n-1为0100
则n&(n-1)=0100=4!=0
从上面我们可以看出,凡是2的幂,均是二进制数的某一高位为1,且仅此高位为1,比如4,0100;8,1000。那么它的n-1就变成了1所处的高位变成0,剩余低位变成1,如4-1,0011,8-1,0111,那么n&(n-1)必为0
也就是n&(n-1)==0
2,一个数的二进制中有多少位为1
while(n>0){
count++;
n = n&(n-1);
}
这个原理有点类似于2的幂,大家可以自己动手试试,文字的解释永远无法战胜自己的亲身实践
3,一个数是否为4的幂
一个数是4的幂,那么必然是2的幂,反之,则不然
那么首先确定条件n&(n-1)==0,确定出该数是否为2的幂,这就找到了一项必要条件
刚才说了一个数是2的幂却不一定是4的幂,比如2,8,32等这些都是2的级数次方
但是,我们可以发现,2的偶数次方,比如2^0=1,2^2=4,2^4=16,这些数减去1,都能被3整除,而2的奇数次方的数减去1之后无法被3整除,不信可以试试
这样的话,我们就可以很容易找到4的幂的充要条件,即 n>0 && ((n&(n-1))==0) && ((n-1)%3==0)
4,接下来还有一些可以用到符号&运算的例子,比如求一个数32位二进制的倒序
int result =0;
for(int i=0;i<32;i++){
result<<=1;//result先左移一位,低位补0
result = result+(n&1);
n>>=1;//n右移一位,高位补0
}
5,将一个数表示为16进制,并返回相应字符串
if(n==0) return "0";
String result ="";
String[] map={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
while(n!=0){
result = map[n&15]+result;
n>>=4;
}
相关文章
- Winform框架中窗体基类的用户身份信息的缓存和提取
- Vue&Element 前端应用开发之菜单和路由的关系
- 在微信框架模块中,基于Vue&Element前端的微信公众号和企业微信的用户绑定
- 在微信框架模块中,基于Vue&Element前端的事件和内容的管理
- 在微信框架模块中,基于Vue&Element前端的后台管理功能介绍
- 使用DevExpress的GridControl实现多层级或无穷级的嵌套列表展示
- 在微信框架模块中,基于Vue&Element前端,通过动态构建投票选项,实现单选、复选的投票操作
- 使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理
- 利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
- 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理
- 使用代码生成工具快速开发ABP框架项目
- 基于ABP框架的SignalR,使用Winform程序进行功能测试
- 如何快速开发Winform应用系统
- 看图知义,Winform开发的技术特点分析
- 循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理
- 循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理
- ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
- 循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
- 一个人的思想:漫谈技术社区
- IDDD 实现领域驱动设计-由贫血导致的失忆症