Как получить двоичное обратное число в Swift? - PullRequest
0 голосов
/ 28 октября 2019

Если у нас есть данное число, скажем, 9 (двоичное представление - 1001). Как мы можем наиболее эффективно получить его обратно 6 (двоичное представление - 0110)? то есть замена 0 на 1 и 1 на 0.

Я написал код порядка O (1) сложности? Но может ли быть лучший путь? Предоставляет ли Swift элегантный способ справиться с этим?

Примечание: функция отрицания ~ 9 приводит к -10. Это не то, что я ищу.

func inverse(of givenNumber: Int) -> Int                             // eg. 9
{
    let binaryRepresentation = String(givenNumber, radix: 2)         // "1001"
    let binaryRepresentationLength = binaryRepresentation.count      // 4
    let maxValueInLength = (1 << binaryRepresentationLength) - 1     // 15, i.e., 1111
    let answer = givenNumber ^ maxValueInLength                      // 6, i.e., 0110
    return answer
}

Редактировать 1: данный номер> 0

1 Ответ

3 голосов
/ 28 октября 2019

Для положительных чисел вы можете использовать следующее:

func intInverse<T: FixedWidthInteger>(of givenNumber: T) -> T                             
{
    assert(!T.isSigned || givenNumber & (T(1) << (givenNumber.bitWidth - 1)) == 0)

    let binaryRepresentationLength = givenNumber.bitWidth - givenNumber.leadingZeroBitCount
    let maxValueInLength = givenNumber.leadingZeroBitCount > 0 ? (~(~T(0) << binaryRepresentationLength)) : ~0
    let answer = givenNumber ^ maxValueInLength 
    return answer
}

Что идентично вашему алгоритму, но не требует строкового числа. Он не работает для отрицательных чисел, но и ваш алгоритм тоже не работает, потому что ваш алгоритм вставляет - в начале числа.

Вероятно, самый простой способ расширить это для охвата отрицательных чисел - это инвертироватьвсе биты, чтобы получить binaryRepresentationLength

РЕДАКТИРОВАТЬ

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...