Slide 1

Slide 1 text

intSize = 32 << (^uint(0) >> 63) とは kyoto.go(2022/02/23)

Slide 2

Slide 2 text

照井寛也 Engineer at Showcase Gig ● Go ● 仙台拠点立ち上げ ● Sendai.go Twitter : @1019Hiroya

Slide 3

Slide 3 text

strconv.Atoiのコードリーディング https://cs.opensource.google/go/go/+/refs/tags/go1.17.7:src/strconv/atoi.go;drc=refs%2Ftags%2Fgo1.17.7;l=52

Slide 4

Slide 4 text

🤔

Slide 5

Slide 5 text

intSize = 32 << (^uint(0) >> 63) 1. uint(0) 2. ^uint(0) 3. ^uint(0) >> 63 4. 32 << (^uint(0) >> 63)

Slide 6

Slide 6 text

uint(0) 環境毎にそれぞれのbit数を埋める (64bit) 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (32bit) 0000 0000 0000 0000 0000 0000 0000 0000

Slide 7

Slide 7 text

^uint(0) ^はビット演算(XOR)。^uint(0)は2進数で表されたものを反転させる (64bit) 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 (32bit) 1111 1111 1111 1111 1111 1111 1111 1111

Slide 8

Slide 8 text

^uint(0) >> 63 >> は右シフト演算。^uint(0) >> 63は2進数の^uint(0)を右に63個ずらす (64bit) 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 ➡0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 (32bit) 1111 1111 1111 1111 1111 1111 1111 1111 ➡0000 0000 0000 0000 0000 0000 0000 0000

Slide 9

Slide 9 text

ここまでで以下となる (64bit) 1 (32bit) 0 ^uint(0) >> 63

Slide 10

Slide 10 text

32 << (^uint(0) >> 63) ここまで来ればもう怖くない (64bit) 32 << 1 (32bit) 32 << 0

Slide 11

Slide 11 text

32 << (^uint(0) >> 63) 32は2進数で 100000 なので (64bit) 32 << 1 ➡100000 << 1 ➡ 1000000 ➡ 64 (32bit) 32 << 0 ➡100000 << 0 ➡ 100000 ➡ 32

Slide 12

Slide 12 text

intSize = 32 << (^uint(0) >> 63) 実行環境によってintSizeを32か64か導き出せるものだった Go Playground https://go.dev/play/p/ub_T-JbcZRm

Slide 13

Slide 13 text

演算の使い方も含めて詳しく解説されている記事もあります 参考になりました https://www.cotegg.com/blog/?p=3311

Slide 14

Slide 14 text

Thank you 👋