zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Lua 数组
    javascript debugger
    Lua 字符串
    警告
    Lua中获取table长度
    Lua 运算符
    Lua 函数
    lua if 流程控制
    pairs 和 ipairs 的区别
    Lua 循环
  • 原文地址:https://www.cnblogs.com/skillking/p/9930095.html
Copyright © 2011-2022 走看看