Skip to content

Latest commit

 

History

History
96 lines (69 loc) · 2.34 KB

4.08.md

File metadata and controls

96 lines (69 loc) · 2.34 KB

セクション 4.8: ビットシフト

セクション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

playground

1桁をずらすビットシフトをしてみました。<<を使うと1001000になり、>>を使うと10010になります。

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

playground

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

playground

どのスタイルが見やすいかで書き方を変えることができます。