2012-02-14 4 views
6

Napisałem głupie rozwiązanie dla tego, lepszego przepisu? Widać tam wiele bezużytecznych konwersji.Go - przekształcić ciąg, który reprezentuje liczbę binarną w 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

Poniższe odpowiedzi są zalecane, ale jeśli naprawdę chcesz zrobić konwersję samemu, można to zrobić bez pomocy bibliotek. Stwórz 'wynik' int i dla każdej iteracji pętli:' result = (result << 1) | (n-'0 ') ' – axw

Odpowiedz

17

Jeśli korzystasz z aktualnego wydania Go (release.r60.3), chcesz funkcję strconv.Btoi64(), który konwertuje z dowolnej bazy.

package main 

import (
    "fmt" 
    "strconv" 
) 

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

Jeśli używasz go 1, chcesz funkcję strconv.ParseInt(), który konwertuje z dowolnej bazy w danym rozmiarze bitowym.

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

Na przykład, idź 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) 
} 

wyjściowa:

13 
+1

Wow, oni na pewno zmienili pakiet' strconv' dla Go 1. –