# N を超えない 2 のべき乗の計算 普通にループ処理するとえらいことなるので、ビット演算を使う。 2 のべき乗(乗数は自然数なので強調するなら累乗)の場合は、二進数で表現すると、先頭が `1` でそれ以外が `0` となる。 - `1` ... $2$ - `10` ... $2^2 = 4$ - `100` ... $2^3 = 8$ Go の `bits.Len(n)` 関数を使うと `n` を表現する最小のビット数が得られる。 `n = 13` は `1011` なので `4` が帰る。 `1000` を超えない 2 のべき乗は `1000` なので、 `1` を `4 - 1 = 3` ビット左シフトすれば良い。 `<<` は左シフト演算子 ```go func largestPowerOfTwoLessThanOrEqual(n int) uint { if n == 0 { return 0 } // 最も高いビットの位置を見つける pos := bits.Len(uint(n)) - 1 // その位置にあるビットが表す 2 の累乗を計算する return 1 << uint(pos) } ```