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)

  • 相关阅读:
    Jessica's Reading Problem POJ
    FatMouse and Cheese HDU
    How many ways HDU
    Humble Numbers HDU
    Doing Homework again
    Stacks of Flapjacks UVA
    Party Games UVA
    24. 两两交换链表中的节点
    面试题 03.04. 化栈为队
    999. 可以被一步捕获的棋子数
  • 原文地址:https://www.cnblogs.com/roscangjie/p/10964408.html
Copyright © 2011-2022 走看看