Работа с восьмеричными числами в Swift

Я могу легко превратить десятичное число в восьмеричное, но я пытаюсь сделать обратное и застреваю.

let decimal = 11_224_393
let octString = String(rawAddress, radix: 8, uppercase: false)
let octal = octString.toInt()

Вопрос

Мне нужна функция, которая с учетом восьмеричного числа Int будет читать его как восьмеричное и преобразовывать в десятичное.

такие как:

// oct2dec(777) = 511
// oct2dec(10) = 8

func oct2dec(octal : Int) -> Int {
    // what goes here?
}

person Jeef    schedule 26.02.2015    source источник
comment
Вы не должны думать о Int как о какой-то конкретной системе счисления. Во всяком случае, в памяти он всегда двоичный. В вашем примере 777 равно 777 в десятичном, 1,411 в восьмеричном и 1,100,001,001 в двоичном одновременно. Его не нужно преобразовывать в восьмеричное; все, что вам нужно сделать, это убедиться, что при преобразовании строк указано, какую систему счисления использовать.   -  person Ky Leggiero    schedule 21.07.2017


Ответы (2)


Использование функций преобразования строк в моем варианте довольно ужасно. Как насчет чего-то вроде этого:

func octalToDecimal(var octal: Int) -> Int {
    var decimal = 0, i = 0
    while octal != 0 {
        var remainder = octal % 10
        octal /= 10
        decimal += remainder * Int(pow(8, Double(i++)))
    }
    return decimal
}

var decimal = octalToDecimal(777) // decimal is 511
person Stefan Arentz    schedule 26.02.2015
comment
В этом нет необходимости, так как для этой проблемы есть стандартные библиотеки. - person Ky Leggiero; 24.05.2019

Просто используйте родной Swift восьмеричные литералы и инициализаторы ( String из целого числа | Int из String).

let octalInt = 0o1234 // 668
let octalString = "1234" // "1234"

let decimalIntFromOctalString = Int(octalString, radix: 0o10) // 668
let octalStringFromInt = String(octalInt, radix: 0o10) // "1234"

Для вашего конкретного варианта использования:

let decimal = 11_224_393
let octString = String(rawAddress, radix: 0o10, uppercase: false)
guard let octal = Int(octString, radix: 0o10) else {
    print("octString was not a valid octal string:", octString)
}
person Ky Leggiero    schedule 21.07.2017
comment
Как ни странно, документация Swift для String.init(_:radix:), на которую я ссылался, утверждает, что она была представлена ​​​​в Xcode 9, есть старые SO ответы, которые его используют, поэтому он должен быть старше Swift 4. - person Ky Leggiero; 22.07.2017