【问题标题】:Golang number base conversionGolang 数基转换
【发布时间】:2017-02-02 07:50:16
【问题描述】:

我想知道,如何在 Golang 中不使用 strconv 的情况下将 base10 数字从一个基数转换为另一个基数?

你能给我一些建议吗?

【问题讨论】:

  • 那你不想用strconv的背景是什么?
  • 当然你可以这样做:Go Playground,但我不认为这是你想要的。
  • 一开始我用strconv,但是研究任务后发现要求不使用这个包
  • 而且我不想以 golang.org/src/strconv/itoa.go?s=628:668#L60 之类的 if else 结尾。
  • 基数只与字符串表示有关,那为什么不用strconv来做呢?否则,您将自己实现 strconv 中的功能。 (顺便说一句,您是否阅读了 if itoa.go 的源代码?if else 链在 3 个块中不是很长,仅用于优化。)

标签: go base-conversion


【解决方案1】:
package main

import (
    "fmt"
    "math/big"
)

func main() {
    fmt.Println(big.NewInt(1000000000000).Text(62))
}

Demo

【讨论】:

    【解决方案2】:

    使用math 包和日志identify

    log_77(x) = log(x) / log(77)

    【讨论】:

      【解决方案3】:

      这可能是作弊,但我想您可以查看strconv.FormatInt 的实现,并以此为例构建一些您自己的代码。这样你不是直接使用它,而是你自己实现的。

      【讨论】:

        【解决方案4】:

        您可以使用此函数将任何十进制数转换为具有您选择的字符集的任何基数。

        func encode(nb uint64, buf *bytes.Buffer, base string) {
          l := uint64(len(base))
          if nb/l != 0 {
            encode(nb/l, buf, base)
          }
          buf.WriteByte(base[nb%l])
        }
        
        func decode(enc, base string) uint64 {
          var nb uint64
          lbase := len(base)
          le := len(enc)
          for i := 0; i < le; i++ {
            mult := 1
            for j := 0; j < le-i-1; j++ {
                mult *= lbase
            }
            nb += uint64(strings.IndexByte(base, enc[i]) * mult)
          }
          return nb
        }
        

        你可以这样使用它:

        // encoding
        var buf bytes.Buffer
        encode(100, &buf, "0123456789abcdef")
        fmt.Println(buf.String())
        // 64
        
        // decoding
        val := decode("64", "0123456789abcdef")
        fmt.Println(val)
        // 100
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-20
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-21
          • 2017-08-22
          相关资源
          最近更新 更多