leetcode笔记:Power of Four

一. 题目描述

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

Example:

Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion?

二. 题目分析

题目的大意是,给定一个32位有符号整数,编写函数,判断它是否是4的幂。

进一步思考:你可以不用循环/递归解决问题吗?

从Power of Two一题中我们知道,一个数为2的幂次方时,满足:该数的二进制表示,最高位为1,其余位为0。而4的幂次方包含在此命题中,所以也是符合该条件的。

但又不同于2的幂次方数,4的幂次方还有一个特性,就是其二进制表示中,0的个数为偶数,比如:

1: 1 0的个数为0个
4: 100 0的个数为2个
16:10000 0的个数为4个
64:1000000 0的个数为6个

若使用循环,则定义一个辅助变量temp,每次移位两次(temp << 2)与输入变量num进行判断;或者将num与10101010101010101010101010101010(即0xaaaaaaaa)相与,若num & 0xaaaaaaaa != 0,表示num不为4的幂次方,此时返回false,否则返回true。

三. 示例代码

// C++,迭代版本
class Solution {
public:
    bool isPowerOfFour(int num) {
        long long temp = 1;
        while (temp < INT_MAX && num >= temp)
        {
            if (num == temp) return true;
            else if (num > temp) temp <<= 2;
        }
        return false;
    }
};
// C++,位运算,无需迭代和递归
class Solution {
public:
    bool isPowerOfFour(int num) {
        if (num > 0 && (num & (num - 1)) == 0 && (num & 0xaaaaaaaa) == 0) return true;
        else return false;
    }
};
// 位运算的Python版本
class Solution(object):
    def isPowerOfFour(self, num):
        """ :type num: int :rtype: bool """
        return num > 0 and num & (num - 1) == 0 and num & 0xaaaaaaaa == 0

四. 小结

该题是经典的位运算题目。

点赞