arekkusu6

Adding and substracting two numbers without directly using `+` or `-`

Mar 26th, 2026
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.49 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "log"
  6.     "slices"
  7.     "strconv"
  8.     "strings"
  9. )
  10.  
  11.  
  12. type Add struct {
  13.     A, B, R int64
  14. }
  15.  
  16.  
  17. type Sub struct {
  18.     A, B int64
  19. }
  20.  
  21.  
  22. func lenDiff(a, b int64, first string) int {
  23.     switch first {
  24.         case "a":
  25.             var ad = len(fmt.Sprintf("%b", b)) - len(fmt.Sprintf("%b", a))
  26.  
  27.             if ad < 0 {
  28.                 return 0
  29.             } else {
  30.                 return ad
  31.             }
  32.  
  33.         case "b":
  34.             var bd = len(fmt.Sprintf("%b", a)) - len(fmt.Sprintf("%b", b))
  35.  
  36.             if bd < 0 {
  37.                 return 0
  38.             } else {
  39.                 return bd
  40.             }
  41.  
  42.         default:
  43.             return 0
  44.     }
  45. }
  46.  
  47.  
  48. func toBit(a, b int64) (ab, bb string) {
  49.     ab = fmt.Sprintf("%s%b", strings.Repeat("0", lenDiff(a, b, "a")), a)
  50.     bb = fmt.Sprintf("%s%b", strings.Repeat("0", lenDiff(a, b, "b")), b)
  51.  
  52.     return
  53. }
  54.  
  55.  
  56. func rangeAdd(a, b string) []Add {
  57.     var rem = make([]Add, len(a) + 1)
  58.    
  59.     var j int
  60.  
  61.     for i := len(a) - 1; i >= 0; i-- {
  62.         ab, bb := int64(a[i] - '0'), int64(b[i] - '0')
  63.  
  64.         if ab == 1 && bb == 1 {
  65.             rem[j].A = ab
  66.             rem[j].B = bb
  67.             rem[j + 1].R = 1
  68.         }
  69.  
  70.         if (ab == 1 && bb == 0) || (ab == 0 && bb == 1) {
  71.             rem[j].A = ab
  72.             rem[j].B = bb
  73.         }
  74.  
  75.         j++
  76.     }
  77.  
  78.     for i, r := range rem {
  79.         if (r.A == 1 && r.B == 0 && r.R == 1) || (r.A == 0 && r.B == 1 && r.R == 1) {
  80.             rem[i + 1].R = 1
  81.         }
  82.     }
  83.  
  84.     return rem
  85. }
  86.  
  87.  
  88. func rangeSub(a, b string) []Sub {
  89.     var rem = make([]Sub, len(a) + 1)
  90.  
  91.     var j int
  92.  
  93.     for i := len(a) - 1; i >= 0; i-- {
  94.         ab, bb := int64(a[i] - '0'), int64(b[i] - '0')
  95.  
  96.         rem[j].A = ab
  97.  
  98.         if bb == 0 {
  99.             rem[j].B = 1
  100.         } else {
  101.             rem[j].B = 0
  102.         }
  103.  
  104.         j++
  105.     }
  106.  
  107.     return rem
  108. }
  109.  
  110.  
  111. func ADD(a, b int64) int64 {
  112.     var neg bool
  113.  
  114.     if a < 0 && b > 0 {
  115.         if -a > b {
  116.             return -SUB(-a, b)
  117.         } else {
  118.             return SUB(b, -a)
  119.         }  
  120.     } else if a > 0 && b < 0 {
  121.         if -b > a {
  122.             return -SUB(-b, a)
  123.         } else {
  124.             return SUB(a, -b)
  125.         }
  126.     } else if a < 0 && b < 0 {
  127.         neg = true
  128.     }
  129.  
  130.     var rem []Add
  131.  
  132.     if neg {
  133.         rem = rangeAdd(toBit(-a, -b))
  134.     } else {
  135.         rem = rangeAdd(toBit(a, b))
  136.     }
  137.  
  138.     var adds []string
  139.  
  140.     for _, r := range rem {
  141.         adds = append(adds, fmt.Sprint(r.A ^ r.B ^ r.R))
  142.     }
  143.    
  144.     slices.Reverse(adds)
  145.  
  146.     res, err := strconv.ParseInt(strings.Join(adds, ""), 2, 0)
  147.  
  148.     if err != nil {
  149.         log.Fatal(err)
  150.     }
  151.  
  152.     if neg {
  153.         return -int64(res)
  154.     }
  155.  
  156.     return int64(res)
  157. }
  158.  
  159.  
  160. func compCalc(ai, bi int64) int64 {
  161.     bi = ADD(bi, 1)
  162.  
  163.     var ab = ADD(ai, bi)
  164.  
  165.     var bfArr = strings.Split(fmt.Sprintf("%b", ab), "")
  166.  
  167.     bfArr = bfArr[1:]
  168.  
  169.     bfi, _ := strconv.ParseInt(strings.Join(bfArr, ""), 2, 0)
  170.  
  171.     return bfi
  172. }
  173.  
  174.  
  175. func SUB(a, b int64) int64 {
  176.     var BgtA, NegAgtB, NegBgtA bool
  177.  
  178.     if a > 0 && b > 0 && a < b {
  179.         BgtA = true
  180.     } else if a > 0 && b < 0 {
  181.         return ADD(a, -b)
  182.     } else if a < 0 && b > 0 {
  183.         return -ADD(-a, b)
  184.     } else if a < 0 && b < 0 {
  185.         if a > b {
  186.             NegAgtB = true
  187.         } else {
  188.             NegBgtA = true
  189.         }
  190.     }
  191.  
  192.     var rem []Sub
  193.  
  194.     if BgtA {
  195.         rem = rangeSub(toBit(b, a))
  196.     } else if NegAgtB {
  197.         rem = rangeSub(toBit(-b, -a))
  198.     } else if NegBgtA {
  199.         rem = rangeSub(toBit(-a, -b))
  200.     } else {
  201.         rem = rangeSub(toBit(a, b))
  202.     }
  203.  
  204.     var aArr, bArr []string
  205.  
  206.     for _, r := range rem {
  207.         bArr = append(bArr, fmt.Sprint(r.B))
  208.         aArr = append(aArr, fmt.Sprint(r.A))
  209.     }
  210.  
  211.     slices.Reverse(aArr)
  212.     slices.Reverse(bArr)
  213.  
  214.     ai, _ := strconv.ParseInt(strings.Join(aArr, ""), 2, 0)
  215.     bi, _ := strconv.ParseInt(strings.Join(bArr, ""), 2, 0)
  216.  
  217.     if BgtA {
  218.         return -compCalc(bi, ai)
  219.     } else if NegAgtB {
  220.         return compCalc(bi, ai)
  221.     } else if NegBgtA {
  222.         return -compCalc(ai, bi)
  223.     }
  224.  
  225.     return compCalc(ai, bi)
  226. }
Advertisement
Add Comment
Please, Sign In to add comment