Guest User

Untitled

a guest
Dec 12th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.16 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/big"
  6. )
  7.  
  8. const (
  9. Big = 1 << 100 // = 1267650600228229401496703205376
  10. Small = Big >> 99 // 演算は可能
  11.  
  12. MAX_INT64 = 1<<63 - 1
  13. )
  14.  
  15. func main() {
  16. // fmt.Println("%v", Big)
  17. // => constant 1267650600228229401496703205376 overflows int
  18. // エラーになる
  19.  
  20. // fmt.Println(reflect.TypeOf(Big).String())
  21. // => constant 1267650600228229401496703205376 overflows int
  22. // これもエラーになる
  23.  
  24. // NOTE: (Big >> 0) & MAX_INT64 は動くが、
  25. // 0の部分を変数にして
  26. // (Big >> uint(i)) & MAX_INT64 とするとエラーになる
  27. // ので、Constがさらに大きい場合のために以下をループで書くことは難しい...
  28.  
  29. result := big.NewInt(0)
  30.  
  31. var lowI int64 = Big & MAX_INT64
  32. result.Add(result, big.NewInt(lowI))
  33.  
  34. var highI int64 = Big >> 63
  35. result.Add(
  36. result,
  37. big.NewInt(0).Mul(
  38. big.NewInt(highI),
  39. big.NewInt(0).Lsh(big.NewInt(1), 63),
  40. ),
  41. )
  42.  
  43. fmt.Println(result) // => 1267650600228229401496703205376
  44.  
  45. // constを使わずに最初からbigでやるのがよい
  46. Big2 := big.NewInt(0).Lsh(big.NewInt(1), 100)
  47. fmt.Println(Big2) // => 1267650600228229401496703205376
  48. }
Add Comment
Please, Sign In to add comment