Upgrade to Pro — share decks privately, control downloads, hide ads and more …

intSize = 32 << (^uint(0) >> 63)とは

D578a481a8b5baad83bff4bf5816b9a4?s=47 Terry
February 23, 2022

intSize = 32 << (^uint(0) >> 63)とは

2/10開催のSendai.goでstrconvのコードリーティングをしました。
その中で「intSize = 32 << (^uint(0) >> 63)」が登場し、紐解くとなるほどすぎたので紹介します。

▼Sendai.go
https://sendaigo.connpass.com/event/237112/

D578a481a8b5baad83bff4bf5816b9a4?s=128

Terry

February 23, 2022
Tweet

More Decks by Terry

Other Decks in Programming

Transcript

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

  2. 照井寛也 Engineer at Showcase Gig • Go • 仙台拠点立ち上げ •

    Sendai.go Twitter : @1019Hiroya
  3. 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

  4. 🤔

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

    ^uint(0) 3. ^uint(0) >> 63 4. 32 << (^uint(0) >> 63)
  6. 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
  7. ^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
  8. ^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
  9. ここまでで以下となる (64bit) 1 (32bit) 0 ^uint(0) >> 63

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

    (32bit) 32 << 0
  11. 32 << (^uint(0) >> 63) 32は2進数で 100000 なので (64bit) 32

    << 1 ➡100000 << 1 ➡ 1000000 ➡ 64 (32bit) 32 << 0 ➡100000 << 0 ➡ 100000 ➡ 32
  12. intSize = 32 << (^uint(0) >> 63) 実行環境によってintSizeを32か64か導き出せるものだった Go Playground

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

  14. Thank you 👋