2の累乗の関数
bool IsPowerOfTwo (int value)
valueが2の累乗かどうかを返します。
// false
Debug.Log(Mathf.IsPowerOfTwo(7));
// true
Debug.Log(Mathf.IsPowerOfTwo(32));
int ClosestPowerOfTwo (int value)
valueに最も近い2の累乗の値を返します。
// 8
Debug.Log(Mathf.ClosestPowerOfTwo(7));
// 16
Debug.Log(Mathf.ClosestPowerOfTwo(19));
int NextPowerOfTwo (int value)
value以上の最も近い2の累乗の値を返します。
// 8
Debug.Log(Mathf.NextPowerOfTwo(7));
// 256
Debug.Log(Mathf.NextPowerOfTwo(139));
// 256
Debug.Log(Mathf.NextPowerOfTwo(256));
2の累乗の長さの配列を作成したりするときに使えます。
使用例
僕の場合は、「高い頻度で長さが変わる配列の生成頻度を抑える」という目的で2の累乗を使用しました。
以下のコードは、実際に2の累乗を使用したコードの一例です。
const int k_BoundingSpheresMinLength = 16;
BoundingSphere[] m_BoundingSpheres = Array.Empty<BoundingSphere>();
readonly List<CullingTarget> m_Targets = new List<CullingTarget>();
// Targetsの数以上かつ、2の累乗の配列を作成する。
void UpdateBoundingSpheres () {
// Targetsの数以上の最も近い2の累乗の値を取得
int nextPowerOfTwo = Mathf.NextPowerOfTwo(m_Targets.Count);
int length = Mathf.Max(nextPowerOfTwo,k_BoundingSpheresMinLength);
if (length != m_BoundingSpheres.Length) {
m_BoundingSpheres = new BoundingSphere[length];
}
}