zoukankan      html  css  js  c++  java
  • 位运算的巧妙利用n&(n-1)

    今天刷leecoda发现n&(n-1)这个用法,觉得很神奇,记录一下

    1,求一个int类型数是否为2的幂

    当n=4时,二进制为:0100

       n-1=3,二进制为:0011

    则:n&(n-1)==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);

    }

    这个n = n&(n-1);这个操作,每一轮都会消耗掉一个1。

    3、一个数是否为3的幂

    用笨办法的话:3在32位里最大为1162261467(3的19次方),所以用1162261467去除n取余

    public class Solution {
        public bool isPowerOfThree(int n) {
            return n>0&&(1162261467%n==0);
        }
    }

    4、一个数是否为4的幂

    一个数是4的幂,那么必然是2的幂,反之,则不然

    那么首先确定条件n&(n-1)==0,确定出该数是否为2的幂,这就找到了一项必要条件

    刚才说了一个数是2的幂却不一定是4的幂,比如2,8,32等这些都是2的级数次方

    但是,我们可以发现,2的偶数次方,比如2^0=1,2^2=4,2^4=16,这些数减去1,都能被3整除,而2的奇数次方的数减去1之后无法被3整除

    这样的话,我们就可以很容易找到4的幂的充要条件,即 n>0 && ((n&(n-1))==0) && ((n-1)%3==0)

  • 相关阅读:
    LruCache
    java 泛型的类型擦除和桥方法
    java Object解析
    android周期性任务
    阿里Sophix热修复
    android 广播
    《Android开发艺术探索》第11章 Android的线程和线程池
    RxJava2 源码分析
    android DDMS中的内存监测工具Heap
    Java的Unsafe类
  • 原文地址:https://www.cnblogs.com/roscangjie/p/10964408.html
Copyright © 2011-2022 走看看