LeetCode-4の累乗



Leetcode Power Four



説明:
整数(符号付き32ビット)が与えられた場合、それが4の累乗であるかどうかをチェックする関数を記述します。

例1:



Input: 16 Output: true

例2:

Input: 5 Output: false

ファローアップ: ループ/再帰なしでそれを解決できますか?



意図:32ビット整数が4の累乗であり、ループや再帰を必要としないかどうかを計算します

解決策:まず、次のように、32ビット未満の4の累乗と2の累乗の2進表現を最初に観察しましょう。

2 k 2 ^ k 4 k 4 ^ k
0 1 1
1 10 100
100 10,000
3 1000 1000000
4 10,000 100000000
5 100,000 10000000000
⋯ cdots ⋯ cdots ⋯ cdots

次の結論を導き出すことができます。



  • 整数が2の累乗として表現できる場合、その2進表現には1 1のみが含まれ、残りは0です。
  • 整数が4の累乗として表現できる場合、その2進表現には1つだけが含まれ、残りは0であり、1の位置は奇数であり、0の数は偶数です。

したがって、最初に、この整数の2進表現に1つしか含まれておらず、残りがすべて0であるかどうか(つまり、2の累乗として表現でき、の累乗を表すには2の累乗が必要かどうか)を判断できます。 4.状態)

num & (num - 1) == 0

十分条件を満たすためには、1の位置が奇数であるという要件(つまり、2の累乗を除いて奇数の累乗を持つもの)の要件の上に要件を追加する必要もあります。

num & 0x55555555 == 0 // 0x55555555(1010101 01010101 01010101 01010101)
Java
class Solution { public boolean isPowerOfFour(int num) { if (num == 0) return false return (num & (num - 1)) == 0 && (num & 0x55555555) != 0 ? true : false } }