n&(n-1)位运算的妙用
一、n-1发生了什么
①、二进制数 n 变成 n-1 后,如果最后一位是 0,将向前一位借 2,2-1=1。最后一位为1。如果前一位为0,将继续向前一位借2,加上本身少掉的1.则变为1。一直遇到1。减为0.
所以 二进制 xxxx10000 - 1 = xxxx01111
②、n&n-1
按照上述 n=xxxx10000,n-1=xxxx01111
xxxx10000
& xxxx01111
-----------------------------------------
xxxx0000
可以看到将原来的最右边的1变为0了。重复这个操作,每一次 n 最右边的 1 少一个。从而统计 n 中的 1 的个数
二、n & n-1 的使用
1 public static int hammingWeight(int n) { 2 int count=0; 3 int t=n; 4 while(t!=0){ 5 t=t&(t-1); 6 count++; 7 } 8 return count; 9 }
我们知道n&(n-1)可以消除掉最低位的1,那么2的幂二进制位中只有一个1,因此我们只需判断n&(n-1)==0即可。eg : 2、4、8、16、32 (都是只包含一个 1)
1 public class Solution { 2 public boolean isPowerOfTwo(int n) { 3 return (n&(n-1))==0&&n>0; 4 } 5 }
参考并摘自
https://blog.csdn.net/nwpu_geeker/article/details/79763511
https://blog.csdn.net/sunxianghuang/article/details/52071137