Swift:二进制、八进制、十进制、十六进制之间的转换

JKSwiftExtension,测试用例在 StriingExtensionViewController.swift 对应的控制器里面
目录:
1、二进制 -> 八进制
2、二进制 -> 十进制
3、二进制 -> 十六进制
4、八进制 -> 二进制
5、八进制 -> 十进制
6、八进制 -> 十六进制
7、十进制 -> 二进制
8、十进制 -> 八进制
9、十进制 -> 十六进制
10、十六进制 -> 二进制
11、十六进制 -> 八进制
12、十六进制 -> 十进制

一、二进制 -> 八进制

// MARK: 11.1、二进制 -> 八进制
/// 二进制 ->转 八进制
/// - Returns: 八进制
func binaryToOctal() -> String {
    // 二进制
    let binary = self
    // 十进制
    let decimal = binary.binaryTodecimal()
    // 八进制
    return decimal.decimalToOctal()
}

二、二进制 -> 十进制

// MARK: 11.2、二进制 -> 十进制
/// 二进制 -> 十进制
/// - Returns: 十进制
func binaryTodecimal() -> String {
    let binary = self
    var sum = 0
    for c in binary {
        if let number = "\(c)".toInt() {
            sum = sum * 2 + number
        }
    }
    return "\(sum)"
}

三、二进制 -> 十六进制

// MARK: 11.3、二进制 转 十六进制
/// 二进制  ->  十六进制
/// - Returns: 十六进制
func binaryToHexadecimal() -> String {
    // 二进制
    let binary = self
    // 十进制
    let decimal = binary.binaryTodecimal()
    // 十六进制
    return decimal.decimalToHexadecimal()
}

四、八进制 -> 二进制

// MARK: 11.4、八进制 -> 二进制
/// 八进制 -> 二进制
/// - Returns: 二进制
func octalTobinary() -> String {
    // 八进制
    let octal = self
    // 十进制
    let decimal = octal.octalTodecimal()
    // 二进制
    return decimal.decimalToBinary()
}

五、八进制 -> 十进制

// MARK: 11.5、八进制 -> 十进制
/// 八进制 -> 十进制
/// - Returns: 十进制
func octalTodecimal() -> String {
    let binary = self
    var sum: Int = 0
    for c in binary {
        if let number = "\(c)".toInt() {
            sum = sum * 8 + number
        }
    }
    return "\(sum)"
}

六、八进制 -> 十六进制

// MARK: 11.6、八进制 -> 十六进制
/// 八进制 -> 十六进制
/// - Returns: 十六进制
func octalToHexadecimal() -> String {
    // 八进制
    let octal = self
    // 十进制
    let decimal = octal.octalTodecimal()
    // 十六进制
    return decimal.decimalToHexadecimal()
}

七、十进制 -> 二进制

// MARK: 11.7、十进制 -> 二进制
/// 十进制 -> 二进制
/// - Returns: 二进制
func decimalToBinary() -> String {
    guard var decimal = self.toInt() else {
        return ""
    }
    var str = ""
    while decimal > 0 {
        str = "\(decimal % 2)" + str
        decimal /= 2
    }
    return str
}

八、十进制 -> 八进制

// MARK: 11.8、十进制 -> 八进制
/// 十进制 -> 八进制
/// - Returns: 八进制
func decimalToOctal() -> String {
    guard let decimal = self.toInt() else {
        return ""
    }
    /*
     guard var decimal = self.toInt() else {
     return ""
     }
     var str = ""
     while decimal > 0 {
     str = "\(decimal % 8)" + str
     decimal /= 8
     }
     return str
     */
    return String(format: "%0O", decimal)
}

九、十进制 -> 十六进制

// MARK: 11.9、十进制 -> 十六进制
/// 十进制 -> 十六进制
/// - Returns: 十六进制
func decimalToHexadecimal() -> String {
    guard let decimal = self.toInt() else {
        return ""
    }
    return String(format: "%0X", decimal)
}

十、十六进制 -> 二进制

// MARK: 11.10、十六进制 -> 二进制
/// 十六进制  -> 二进制
/// - Returns: 二进制
func hexadecimalToBinary() -> String {
    // 十六进制
    let hexadecimal = self
    // 十进制
    let decimal = hexadecimal.hexadecimalToDecimal()
    // 二进制
    return decimal.decimalToBinary()
}

十一、十六进制 -> 八进制

// MARK: 11.11、十六进制 -> 八进制
/// 十六进制  -> 八进制
/// - Returns: 八进制
func hexadecimalToOctal() -> String {
    // 十六进制
    let hexadecimal = self
    // 十进制
    let decimal = hexadecimal.hexadecimalToDecimal()
    // 八进制
    return decimal.decimalToOctal()
}

十二、十六进制 -> 十进制

// MARK: 11.12、十六进制 -> 十进制
/// 十六进制  -> 十进制
/// - Returns: 十进制
func hexadecimalToDecimal() -> String {
    let str = self.uppercased()
    var sum = 0
    for i in str.utf8 {
        // 0-9 从48开始
        sum = sum * 16 + Int(i) - 48
        // A-Z 从65开始,但有初始值10,所以应该是减去55
        if i >= 65 {
            sum -= 7
        }
    }
    return "\(sum)"
}

你可能感兴趣的:(Swift:二进制、八进制、十进制、十六进制之间的转换)