2012-02-14 41 views
6

Tôi đã viết một giải pháp ngu ngốc cho việc này, bất kỳ công thức nào tốt hơn? Như bạn có thể thấy rất nhiều chuyển đổi vô dụng ở đó.Go - chuyển đổi chuỗi đại diện cho số nhị phân thành 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

Những câu trả lời dưới đây được khuyến khích, nhưng nếu bạn thực sự muốn làm việc chuyển đổi chính mình, bạn có thể làm điều đó mà không có bất kỳ sự trợ giúp nào từ các thư viện. Đặt 'result' thành int và cho mỗi lần lặp của vòng lặp,' result = (kết quả << 1) | (n-'0 ') ' – axw

Trả lời

17

Nếu bạn đang sử dụng phiên bản Go hiện tại (release.r60.3), bạn muốn hàm strconv.Btoi64() chuyển đổi từ cơ sở tùy ý.

package main 

import (
    "fmt" 
    "strconv" 
) 

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

Nếu bạn đang sử dụng Go 1, bạn muốn strconv.ParseInt() chức năng, chuyển đổi từ một căn cứ tùy ý, vào một kích thước chút nào.

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

Ví dụ, trên Go 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) 
} 

Output:

13 
+1

Wow, chúng chắc chắn đã thay đổi gói' strconv' cho Go 1. –

Các vấn đề liên quan