2012-02-14 145 views
6

我为此写了一个愚蠢的解决方案,任何更好的配方? 正如你可以看到很多无用的转换。Go - 将表示二进制数的字符串转换为int

package main 

import (
    "fmt" 
    "strconv" 
    "math" 
) 

func conv(str string) int { 
    l := len(str) 
    result := 0.0 
    for i,n := range str { 
     number,_ := strconv.Atof64(string(n)) 
     result += math.Exp2(float64(l-i-1))*number 
    } 
    return int(result) 
} 

func main() { 
    fmt.Println(conv("1001")) 
} 
+1

下面的答案被推荐,但如果你真的想自己做转换,你可以做到这一点没有任何图书馆的帮助。让'result'成为int,并且对于循环的每次迭代,结果=(result << 1)|(n-'0')' – axw 2012-02-14 06:04:31

回答

17

如果您使用当前版本围棋(release.r60.3),你想要的strconv.Btoi64()功能,从任意基地转换。

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    if i, err := strconv.Btoi64("1001", 2); err != nil { 
     fmt.Println(err) 
    } else { 
     fmt.Println(i) 
    } 
} 

如果您使用转到1,你想要的strconv.ParseInt()功能,从任意基地转变,在给定的位大小。

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    if i, err := strconv.ParseInt("1001", 2, 64); err != nil { 
     fmt.Println(err) 
    } else { 
     fmt.Println(i) 
    } 
} 
6

例如,在围棋1,

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    i, err := strconv.ParseInt("1101", 2, 64) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    fmt.Println(i) 
} 

输出:

13 
+1

哇,他们确实改变了Go 1的'strconv'包。 – 2012-02-14 05:39:05

相关问题