求解power of tow问题(判断一个数是否为2的幂次方数)

public class PowerOfTow {

    public static void main(String[] args) {
        System.out.println(isPowerOfTow(4));
        System.out.println(isPowerOfTow1(4, 0));
        System.out.println(isPowerOfTow2(3));
    }

    /**
     * 解法一:
     * 2的幂次方数都有一个特点,就是只有高位为1,其它位都是0,所以值需要统计位当中出现了几个1即可
     * 那这个怎么实现呢?那就是让这个数n不断的左移,然后与1相与,如果是2的幂次方,
     * 那么除了最高位移到了最右与1相与能得到1,其它的情况下都得到的是0,
     * 所以将这些相与的结果(把01)相加如果等于1那就说明是2的幂次方数
     * @param n
     * @return
     */
    private static  boolean isPowerOfTow(int n) {
        int curr = 0;
        while (n > 0) {
            curr += n & 1;
            n = n >> 1;
        }
        return  curr == 1;
    }

    /**
     * 这中解法就是解法一的思路,只不过是用递归代替了循环
     * @param n
     * @param curr
     * @return
     */
    private static boolean isPowerOfTow1(int n, int curr) {
        if (n <= 0)
            return curr == 1;
        return  isPowerOfTow1(n >> 1, curr += n & 1);
    }

    /**
     * 解法二:
     * 这中解法也是根据2的幂次方数的二进制数特点来实现的,
     * 只要是2的幂次方数都是最高位是1,其它位是0
     * 那么只要将一个最高为是0其它位是1的数和这个数相与就能得到0,这个数就是当前2的幂次方数减一即可
     *
     * @param n
     * @return
     */
    private static boolean isPowerOfTow2(int n) {
        return ((n & (n - 1)) == 0);
    }

}

猜你喜欢

转载自blog.csdn.net/tab_yls/article/details/80953217