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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM