题解 | #整数与IP地址间的转换#
整数与IP地址间的转换
https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea
package main
import (
"fmt"
"strings"
"strconv"
"math"
)
func ip2number(s string) int {
var bits [32]int
var idx int
ipSegment := strings.Split(s, ".")
for _, segment := range ipSegment {
var bit [8]int
segmentIdx := 7
number, _ := strconv.Atoi(segment)
for number > 0 {
bit[segmentIdx] = number % 2
number /= 2
segmentIdx--
}
for i:=0; i<8; i++ {
bits[idx] = bit[i]
idx++
}
}
var sum int
var powIdx int
for i:=31; i>=0; i-- {
sum += bits[i] * int(math.Pow(float64(2.0), float64(powIdx)))
powIdx++
}
return sum
}
func number2ip(n int) string {
var bits [32]int
idx := 31
for n > 0 {
bits[idx] = n % 2
n /= 2
idx--
}
var ipSegment []int
for i:=0; i<32; i=i+8 {
segment := bits[i:i+8]
var sum int
var powIdx int
for j:=7; j>=0; j-- {
sum += segment[j] * int(math.Pow(float64(2.0), float64(powIdx)))
powIdx++
}
ipSegment = append(ipSegment, sum)
}
return fmt.Sprintf("%d.%d.%d.%d", ipSegment[0], ipSegment[1], ipSegment[2], ipSegment[3])
}
func main() {
var ip string
var n int
fmt.Scan(&ip, &n)
fmt.Println(ip2number(ip))
fmt.Println(number2ip(n))
}
// 本题输入为两行,所以采用:fmt.Scan(&ip, &n)
查看14道真题和解析