Kotlinでビット操作

Kotlinでビット操作を行うときのメモ。
よく使うビット操作をユーティリティメソッドとして以下にまとめました。

object BitwiseOperation {

  // numのiビット目の値(0もしくは1)を取得する
  fun getBit(num: Int, i: Int): Int =
    (num and createMask(i, i)).countOneBits()

  // numのiビット目に1をセットした整数を取得する
  fun setBit(num: Int, i: Int): Int =
    num or createMask(i, i)

  // numのiビット目を0にクリアした整数を取得する
  fun clearBit(num: Int, i: Int): Int =
    num and createMask(i, i, false)

  // numのiビット目を0もしくは1に変更した整数を取得する
  fun updateBit(num: Int, i: Int, shouldSet: Boolean): Int =
    if (shouldSet) setBit(num, i) else clearBit(num, i)

  // from〜toビット目が1(もしくは0)で、それ以外が0(もしくは1)となる整数を取得する
  fun createMask(from: Int, to: Int, shouldSet: Boolean = true): Int {
    require(from in 0 until Int.SIZE_BITS) { "from must be in the range of int bit size." }
    require(to in 0 until Int.SIZE_BITS) { "to must be in the range of int bit size." }
    require(from <= to) { "Incorrect indices combination. from: $from, to: $to" }

    val mask = (allOneBits shl (to + 1)).inv() and (allOneBits shl from)
    return if (shouldSet) mask else mask.inv()
  }

  // 全てのビットが1となる整数を取得する
  fun getAllOneBits(): Int = allOneBits

  private const val allOneBits: Int = 0.inv()
}