浅谈n&(n-1)

  在做算法题时,经常会发现大佬们都使用了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-10100

则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的偶数次方,比如20=1,22=4,2^4=16,这些数减去1,都能被3整除,而2的奇数次方的数减去1之后无法被3整除,不信可以试试
这样的话,我们就可以很容易找到4的幂的充要条件,即 n>0 && ((n&(n-1))0) && ((n-1)%30)

4.接下来还有一些可以用到符号&运算的例子,比如求一个数32位二进制的倒序

int result =0for(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;

}

  大致应该就这么多,如果发现还有的话,以后在进行补充啦!😁
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值