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

コードレビューで泣かないためのintSize = 32 << (^uint(0) >> 63)

uhzz
March 01, 2022

コードレビューで泣かないためのintSize = 32 << (^uint(0) >> 63)

uhzz

March 01, 2022
Tweet

More Decks by uhzz

Other Decks in Technology

Transcript

  1. - intSize = 32 << (^uint(0) >> 63)って何? - そもそも”<<”って何?

    - “^”って何? - intSize = 32 << (^uint(0) >> 63)のマジック - OS(32bit)の場合 - OS(64bit)の場合 今日話すこと
  2. シフト演算子です The shift operators shift the left operand by the

    shift count specified by the right operand [...] As a result, x << 1 is the same as x*2 and x >> 1 is the same as x/2 but truncated towards negative infinity. https://go.dev/ref/spec#Arithmetic_operators (直訳) シフト演算子は左オペランドを、右オペランドで指定した回数だけシフトする。 結果、x << 1は x*2 と同じ意味で、 x >> 1は x/2 と同じ意味になりますが、後者は負の無限大に向かって切り捨てられます。 つまり、<<を使うと、2倍ずつ増えていき、>>を使うと、1/2倍ずつ減っていきます
  3. ビット演算子(XOR)です ^x bitwise complement is m ^ x with m

    = "all bits set to 1" for unsigned x and m = -1 for signed x https://go.dev/ref/spec#Arithmetic_operators (直訳) ^x はビット単位の(1の)補数です。 m ^ xは x が符号なしの場合、「mのすべてのビットに1をセット」、xが符号ありの場合は 「m=-1」にします。 つまり、1の補数ということは各ビットを反転させるということ!