[Kotlin]数値と演算子のチートシート

今回はKotlin標準で用意されている数値の型やその表記、キャスト、演算子などをまとめてお送りします。

数値の型

符号有りの数値型は6種類。

型名ビット数最小数 ~ 最大数値の表記例
Byte8-128 ~ 12757
Short16-32768 ~ 32767298
Int32-2147483648 ~ 214748364712345
Long64-9223372036854775808 ~ 922337203685477580712345L
Float32-3.4028235×1038 ~ 3.4028235×10381.9083F
Double64– 1.7976931348623157×10308 ~ 1.7976931348623157×103088.28921

表記の際にはアンダースコアで桁を区切ることが許されています。

val a = 1_234_567_890     //1234567890

unsigned(符号無し)の数値型はKotlin1.3以降で使用可能

型名ビット数最小数 ~ 最大数値の表記例
UByte80 ~ 25510u
UShort160 ~ 65535567u
UInt320 ~ 429496729570191u
ULong640 ~ 184467440737095516151808383uL

数値型へのキャスト(変換)

Kotlinでは数値型の暗黙的なキャストは行われません。そのため下のようなコードはエラーです。

val a = 1
val b: Byte = a
//Type mismatch: inferred type is Int but Byte was expected
//型の不一致: 推論される型はIntだが、Byte型が求められる

他の数値型への明示的なキャストはto〇〇メソッドを使います。

"123".toByte()     //123   文字列 → Byte
45.toDouble()     //45.0   Int → Double
678.9.toInt()     //678   Double → Int 小数点以下切り捨て

ただし少数の文字列からInt型などへは一発では変換できません。一旦少数への型変換を行いましょう。

"12.3".toInt()     //NumberFormatException
"12.3".toDouble().toInt()     //12

キャストが失敗した場合にnullを代入するto〇〇orNullも用意されています。

val a = "123.5"
val b: Int? = a.toIntOrNull()   //null
val c: Double? = a.toDoubleOrNull()     //123.5

エルビス演算子と組み合わせることでnullを回避することも可能。

val a = "123.5"
val b = a.toIntOrNull()?: 0   //結果がnullになれば代わりに0を代入

上記以外の数値表記

2進数/16進数は接頭語を付けて表記しましょう。printlnに渡した場合などは自動的に10進数に変換されます。なお8進数には対応していません。

接頭語表記例10進数表記
2進数0b0b11110110110107898
16進数0x0x83f7d540541

指数表記には対応。通常の書き方でOKです。

1.23e5 == 123000.0

演算子

演算子オーバーロード

数値がサポートする演算子は数多くあります。演算子に対応したメソッドが存在するなら、そのメソッドをオーバーロードすることで独自の動作をさせることも可能です。

data class Ex(val x: Int)
operator fun Ex.plus(other: Ex) = Ex(x + other.x)
//+演算子をオーバーロード
fun main() {
    val a = Ex(3)
    val b = a + Ex(5)
    println(b)
}
//Ex(x=8)

算術演算子

演算子メソッド意味
a + ba.plus(b)
a – ba.minus(b)
a * ba.times(b)×
a / ba.div(b)÷
a % ba.mod(b)aをbで割った余り

べき乗はKotlin.Mathパッケージのpowメソッドで行います。

Math.pow(2.0,3.0)     //8.0
[Kotlin]べき乗を行う方法 / Mathパッケージのメソッド
Kotlinで最初に迷ったのがべき乗。例えばPythonで3の3乗を行うにはこの...

%(モジュロ演算)で整数部分を落とす

Int % 2で偶数/奇数を割り出す計算はメジャーですが、Double % 1を使って少数から整数部分を落とすような使い方もできます。

val a = "%.3f".format(123.456 % 1)   //0.456

後述のformatメソッドと合わせて試してみてください。

Char型の計算

Char型は内部的にはUnicodeの1文字を表す数値です。そのため+-の計算を行うことができます。

'A'.toInt()     //65
'c' - 1     //b
1 + 'c'     //Error。Char型が左辺でなければならない

複合代入演算子

演算子メソッド意味
a += ba.plusAssign(b)a + b の結果をaに代入
a -= ba.minusAssign(b)a – b の結果をaに代入
a *= ba.timesAssign(b)a * b の結果をaに代入
a /= ba.divAssign(b)a / b の結果をaに代入
a %= ba.modAssign(b)a % b の結果をaに代入

インクリメント/デクリメント演算子

演算子メソッド意味
a++a.inc()aに1を足す
a--a.dec()aから1を引く

この演算子を使う場合は前置/後置で挙動が変わるので注意しましょう。

var a = 1
var b = ++a     //b == 2
var a = 1
var b = a++     //インクリメントする前の値がbに入るため、b == 1

比較演算子

いずれの演算子も結果が正解であればtrue、そうでなければfalseを出力します。

演算子メソッド意味
a == ba.equals(b)aとbは等値である
a != b!(a.equals(b))aとbは等値ではない
a === baとbは同一である
a !== baとbは同一ではない
a > ba.compareTo(b) > 0aがbより大きい
a < ba.compareTo(b) < 0aがbより小さい
a >= ba.compareTo(b) >= 0aがb以上
a <= ba.compareTo(b) <= 0aがb以下

ビット演算子

演算子メソッド意味
a shl ba.shl(b)符号付左シフト (Javaの <<)
a shr ba.shr(b)符号付右シフト (Javaの >>)
a ushr ba.ushr(b)符号なし右シフト (Javaの >>>)
a and ba.and(b)ビット演算のAND
a or ba.or(b)ビット演算のOR
a xor ba.xor(b)ビット演算のXOR
a.inv()ビット反転

「ビット演算って何?」という方はこちらが分かりやすいです。

ビット演算入門 - Qiita
ビット演算入門プログラムの基本であるビット演算ですが、はっきり言って知らなくても何とでもなります。ですが、知っている事によってプログラムの選択肢を広げる事ができ、実際に使うと便利な場面もあります。さらにビット演算は多くのコンピューター言語で使用する事ができるため、一度覚えれば様々な環境で使う事ができます…

論理演算子

演算子意味
a and b
a && b
論理積: aとb両方trueであればtrue。それ以外はfalse
a or b
a || b
論理和: aとb両方falseでなければtrue
a xor b排他的論理和: aかbいずれかがtrueのときのみtrue
! aaのtrue/falseを反転

論理演算子は数値単体ではなく、結果がBooleanになる式を左辺右辺ともに配置します。

val a = 1
val b = 2

(a == 0) or (b == 2)     //true
(a > 0) xor !(b < 2)  //右辺に!があるためどちらもtrue → 最終結果はfalse

その他の演算子

演算子メソッド意味
a .. ba.rangeTo(b)aからbまでの範囲(IntRange型を生成)
a in bb.contains(a)aがbに含まれていればtrue
a !in b!b.contains(a)aがbに含まれていなければtrue

IntRange型を使ったList<Int>の作成

IntRange型をlistOf()の引数に入れるとList<IntRange>になります。要素をInt型にしたい場合はIntRange型をそのままtoList()でList型に変換しましょう。

val a: List<IntRange> = listOf(1..3)   //[1..3]
val b: List<Int> = (1..3).toList()   //[1,2,3]

3 in a //The integer literal does not conform to the expected type IntRange
       //Int型(3)は期待されているIntRange型に準拠していない

3 in b     //true

三項演算子

Kotlinには三項演算子は存在しません。if式でやりましょう。

val a = 10
if(a == 10) println(1) else println(0)
//trueならelseの左、falseなら右側が出力される

formatメソッドを用いた数値の整形

数値を整形するにはformatメソッドが利用の幅が広くて便利。

//指定した桁数で少数の四捨五入
val a = 123.45
"%.0f".format(a)   //123
"%.1f".format(a)   //123.5

//数値を3桁でカンマ区切り
val a = 123456789.123
"%,d".format(a.toInt())     //123,456,789

//ゼロ埋め
val a = 12345
"%,08d".format(a)     //0012,345
[Kotlin] formatメソッドと指定子の使い方
今回はKotlinのformatメソッドに焦点を当て、その呼び出しと使い方につい...
タイトルとURLをコピーしました