# 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)
}
```