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

posted @ 2018-11-08 16:51  skillking2  阅读(4265)  评论(0编辑  收藏  举报