Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- "math/big"
- )
- const (
- Big = 1 << 100 // = 1267650600228229401496703205376
- Small = Big >> 99 // 演算は可能
- MAX_INT64 = 1<<63 - 1
- )
- func main() {
- // fmt.Println("%v", Big)
- // => constant 1267650600228229401496703205376 overflows int
- // エラーになる
- // fmt.Println(reflect.TypeOf(Big).String())
- // => constant 1267650600228229401496703205376 overflows int
- // これもエラーになる
- // NOTE: (Big >> 0) & MAX_INT64 は動くが、
- // 0の部分を変数にして
- // (Big >> uint(i)) & MAX_INT64 とするとエラーになる
- // ので、Constがさらに大きい場合のために以下をループで書くことは難しい...
- result := big.NewInt(0)
- var lowI int64 = Big & MAX_INT64
- result.Add(result, big.NewInt(lowI))
- var highI int64 = Big >> 63
- result.Add(
- result,
- big.NewInt(0).Mul(
- big.NewInt(highI),
- big.NewInt(0).Lsh(big.NewInt(1), 63),
- ),
- )
- fmt.Println(result) // => 1267650600228229401496703205376
- // constを使わずに最初からbigでやるのがよい
- Big2 := big.NewInt(0).Lsh(big.NewInt(1), 100)
- fmt.Println(Big2) // => 1267650600228229401496703205376
- }
Add Comment
Please, Sign In to add comment