golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語(golang) 数値

golang.png


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


この他にもビット演算を使った ビットフラグ について記事にしてます。