Go言語(golang) 数値
Go言語の単純な数の計算と算術演算子(ビット演算子)の使い方。
数値に関する型(それぞれの型で扱える範囲)
uint 整数 uint8 0 〜 255 uint16 0 〜 65535 uint32 0 〜 4294967295 uint64 0 〜 18446744073709551615 int 整数 int8 -128 〜 127 int16 -32768 〜 32767 int32 -2147483648 〜 2147483647 int64 -9223372036854775808 〜 9223372036854775807 float32 浮動小数値 float64 浮動小数値 complex64 複素数 complex128 複素数
目次
明示的に型を指定しなければ int型(OSが64ビットであればint64)、
小数点があれば float型(OSによる) になる。
package main import ( "fmt" "reflect" ) func main() { var t string n := 100 t = reflect.TypeOf(n).String() // 型名を取得する関数 fmt.Println(t) // int f := 42.195 t = reflect.TypeOf(f).String() fmt.Println(t) // float64 // どちらかが浮動小数点数があれば float になる a := 42.195 * 2 t := reflect.TypeOf(a).String() fmt.Println(t, a) // float64 84.39 // 変数に入れると float に変換しないとエラーになる b := 2 c := 42.195 * float64(b) t := reflect.TypeOf(c).String() fmt.Println(t, c) // float64 84.39 }
算術演算子
+ 和 - 差 * 積 / 商 % 余り
算術演算子の使い方
package main func main() { // 足し算 a := 10 + 10 println(a) // 20 // 引き算 b := 10 - 5 println(b) // 5 // 掛け算 c := 10 * 10 println(c) // 100 // 割り算 d := 10 / 2 println(d) // 5 // 余り e := 10 % 3 println(e) // 1 // 計算の順序 f := 20 - (9+11)/2 println(f) // 10 }
代入演算子と算術演算子
+= -= *= /= %=
以下のように同時に使うことができる
package main func main() { a := 10 // a = a + 10 と同じ意味 a += 10 println(a) // 20 b := 10 // b = b - 5 と同じ意味 b -= 5 println(b) // 5 c := 10 // c = c * 10 と同じ意味 c *= 10 println(c) // 100 d := 10 // d = d / 2 と同じ意味 d /= 2 println(d) // 5 e := 10 // e = e % 2 と同じ意味 e %= 3 println(e) // 1 }
インクリメント、デクリメント
++ 1増やす(インクリメント) -- 1減らす(デクリメント)
インクリメント、デクリメントの使い方
package main func main() { a := 10 // ++ は a = a + 1 や a += 1 と同じ意味 a++ println(a) // 11 a++ println(a) // 12 a++ println(a) // 13 // -- は a = a - 1 や a -= 1 と同じ意味 a-- println(a) // 12 a-- println(a) // 11 a-- println(a) // 10 }
ビット演算
& AND(ビット積) | OR(ビット和) ^ XOR(ビットごとの否定) &^ AND NOT(ビットクリア) << 左シフト(1ビット左に桁を移動する) >> 右シフト(1ビット右に桁を移動する)
ビット演算の使い方
package main import "fmt" func main() { a, b := 10, 12 // a と b を 2進数で出力 fmt.Printf("2進数:\na = %b\nb = %b\n", a, b) // 2進数: // a = 1010 // b = 1100 // 2進数の位がどちらも 1 の場合 1 どちらかが 0 の場合 0 になる // a,b は 千の位 のみがどちらも 1 なので 1000 になる c := a & b fmt.Printf("%b\n", c) // 1000 // 位のどちらかが 1 の場合 1 に、どちらも 0 の場合 0 になる d := a | b fmt.Printf("%b\n", d) // 1110 // どちらかが 1 の場合 1 に、それ以外は 0 になる e := a ^ b fmt.Printf("%04b\n", e) // 0110 // a の 1 になっている位に対して b が 1 であれば 0 にする // つまり、0 にしたい位を b で指定できる f := a &^ b fmt.Printf("%04b\n", f) // 0010 }
シフト
package main import "fmt" func main() { a := 2 fmt.Printf("2進数: %b\n", a) // 10 // ビットを左に一桁移動する b := a << 1 fmt.Printf("%b\n", b) // 100 // ビットを右に一桁移動する c := a >> 1 fmt.Printf("%b\n", c) // 1 }
1024 バイトを 1KB (キロバイト)として 10MB (メガバイト) は 10485760 バイトなので左シフトを使って以下のように書ける
package main func main() { println(10 << 20) // 10485760 (10MB) println(30 << 20) // 31457280 (30MB) println(60 << 20) // 62914560 (60MB) }
アスキーコードのアルファベットを大文字/小文字変換する
package main import "fmt" func main() { a := 'a' fmt.Printf("%c, %d, U+%04x\n", a, a, a) // a, 97, U+0061 // 大文字にする A := a ^ 32 fmt.Printf("%c, %d, U+%04x\n", A, A, A) // A, 65, U+0041 // 小文字にする fmt.Printf("%c, %d, U+%04x\n", A ^ 32, A ^ 32, A ^ 32) // a, 97, U+0061 // アルファベットを大文字、小文字ですべて表示 for i := 97; i < 123; i++ { fmt.Printf("LowerCase: %c, U+%04x, %d\n", i, i, i) I := i ^ 32 fmt.Printf("UpperCase: %c, U+%04x, %d\n", I, I, I) } }
この他にもビット演算を使った ビットフラグ について記事にしてます。