セクション4.5: 数値システムで、16進数などのシステムを学びました。全てが0と1で構成される2進数についても見てきましたね。
2進数での1,2,3は1,10,11ですね。そして2進数にはビットシフトという考え方があります。
0000 0010
に対してビットシフトを行うと、0000 0100
になるという感じです。
演算子と記号をビットシフトをするための<<
と>>
演算子があります。
package main
import (
"fmt"
)
func main() {
x := 4
fmt.Printf("decimal: %d\t\tbinary: %b\n", x, x)
y := x << 1
fmt.Printf("decimal: %d\t\tbinary: %b\n", y, y)
z := x >> 1
fmt.Printf("decimal: %d\t\tbinary: %b\n", z, z)
}
The result is:
decimal: 4 binary: 100
decimal: 8 binary: 1000
decimal: 2 binary: 10
1桁をずらすビットシフトをしてみました。<<
を使うと100
が1000
になり、>>
を使うと100
は10
になります。
kbからmb、そしてgbへとサイズを変えたいときは、10回左シフトをすれば値を得ることができます。
package main
import (
"fmt"
)
func main() {
kb := 1024
mb := 1024 * kb
gb := 1024 * mb
fmt.Printf("kb: decimal: %d \t\tbinary: %b\n", kb, kb)
fmt.Printf("mb: decimal: %d \t\tbinary: %b\n", mb, mb)
fmt.Printf("gb: decimal: %d \tbinary: %b\n", gb, gb)
}
kb: decimal: 1024 binary: 10000000000
mb: decimal: 1048576 binary: 100000000000000000000
gb: decimal: 1073741824 binary: 1000000000000000000000000000000
ここでiotaを使うこともできます。
package main
import (
"fmt"
)
const (
_ = iota
// kb = 1024
kb = 1 << (iota * 10)
mb = 1 << (iota * 10)
gb = 1 << (iota * 10)
)
func main() {
fmt.Printf("kb: decimal: %d \t\tbinary: %b\n", kb, kb)
fmt.Printf("mb: decimal: %d \t\tbinary: %b\n", mb, mb)
fmt.Printf("gb: decimal: %d \tbinary: %b\n", gb, gb)
}
どのスタイルが見やすいかで書き方を変えることができます。