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

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

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/

Terry

February 23, 2022
Tweet

More Decks by Terry

Other Decks in Programming

Transcript

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

    ^uint(0) 3. ^uint(0) >> 63 4. 32 << (^uint(0) >> 63)
  2. 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
  3. ^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
  4. ^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
  5. 32 << (^uint(0) >> 63) 32は2進数で 100000 なので (64bit) 32

    << 1 ➡100000 << 1 ➡ 1000000 ➡ 64 (32bit) 32 << 0 ➡100000 << 0 ➡ 100000 ➡ 32