12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package main
- // add binary
- // func minInt(x, y int) int {
- // if x < y {
- // return x
- // }
- // return y
- // }
- const one, zero = byte('1'), byte('0')
- func add3Bi(x, y, z byte) (sum, remain byte) {
- switch x + y + z - 3*zero {
- case 0:
- return zero, zero
- case 1:
- return one, zero
- case 2:
- return zero, one
- case 3:
- return one, one
- default:
- return
- }
- }
- func reverseStr(s string) string {
- runes := []rune(s)
- for from, to := 0, len(s)-1; from < to; from, to = from+1, to-1 {
- runes[from], runes[to] = runes[to], runes[from]
- }
- return string(runes)
- }
- func addBinary(a string, b string) string {
- la, lb := len(a)-1, len(b)-1
- sum, remain := zero, zero
- res := make([]rune, 0)
- for i := 0; i <= minInt(la, lb); i++ {
- sum, remain = add3Bi(a[la-i], b[lb-i], remain)
- res = append(res, rune(sum))
- }
- lc := 0
- var c string
- if la < lb {
- c = b
- lc = lb
- } else {
- c = a
- lc = la
- }
- for i := minInt(la, lb) + 1; i <= lc; i++ {
- sum, remain = add3Bi(zero, c[lc-i], remain)
- res = append(res, rune(sum))
- }
- if remain == one {
- res = append(res, rune(one))
- }
- return reverseStr(string(res))
- }
|