Разложение числа в степени 2 - PullRequest
0 голосов
/ 23 мая 2019

Привет, мне нужно разложить число в степени 2 в swift 5 для приложения для iOS, которое я пишу для системы "нажми и собери".

Серверная часть этой системы написана на c # и использует следующее для сохранения списка опций с множественным выбором как одно число в базе данных, например:

выбор салатов для рулона с начинкой в ​​системе заказов работает следующим образом:

lettuce = 1
cucumber = 2
tomato = 4
sweetcorn = 8
onion = 16

с помощью этого метода он сохраняет параметры в базе данных для выбора, сделанного как (салат + помидор + лук) = 21 (1 + 4 + 16)

на другом конце я использую функцию c #, чтобы сделать это таким образом:

for(int j = 0; j < 32; j++)
    {
    int mask = 1 << j;
    }

Мне нужно преобразовать эту функцию в быстрый формат 5, чтобы интегрировать декодер в мое приложение для iOS

любая помощь будет принята с благодарностью

Ответы [ 3 ]

1 голос
/ 23 мая 2019

В Swift эти битовые поля выражаются в виде наборов опций, которые являются типами, которые соответствуют протоколу OptionSet . Вот пример для вашего варианта использования:

struct Veggies: OptionSet {
    let rawValue: UInt32

    static let lettuce = Veggies(rawValue: 1 << 0)
    static let cucumber = Veggies(rawValue: 1 << 1)
    static let tomato = Veggies(rawValue: 1 << 2)
    static let sweetcorn = Veggies(rawValue: 1 << 3)
    static let onion = Veggies(rawValue: 1 << 4)
}

let someVeggies: Veggies = [.lettuce, .tomato]
print(someVeggies) // => Veggies(rawValue: 5)

print(Veggies.onion.rawValue) // => 16

Наборы параметров лучше, чем просто использование их необработанных значений, по двум причинам:

1) Они стандартизуют названия дел и предоставляют согласованный и простой способ взаимодействия с этими значениями. 2) OptionSet происходит от протокола SetAlgebra и предоставляет реализации по умолчанию для многих полезных методов, таких как union, intersection, subtract, contains и т. Д.

Однако я бы предостерег от этой схемы. Наборы опций полезны только тогда, когда есть действительно небольшое количество флагов (менее 64), которые нельзя предвидеть расширением. Они действительно просты, не могут хранить какую-либо полезную нагрузку, кроме «x существует или нет», и они в первую очередь предназначены для случаев использования, которые имеют очень высокую чувствительность к производительности и использованию памяти, что в наши дни происходит очень редко. Я бы рекомендовал вместо этого использовать обычные объекты (класс Veggie, хранение имени и любые другие соответствующие данные).

0 голосов
/ 26 мая 2019

Привет, я понял, это мое окончательное решение:

    var salads = "" as String
    let value = 127
    var j=0
    while j < 256 {

        let mask=1 << j
        if((value & mask) != 0) {
            salads.append(String(mask) + ",")
        }
        j += 1
    }
    salads = String(salads.dropLast()) // removes the final ","
    print(salads)

Теперь это хорошо отражено в предложении in в моем SQL-запросе, спасибо всем за помощь! :)

0 голосов
/ 23 мая 2019

Вы можете просто использовать цикл while, например так:

var j = 0
while j < 32 {
    var mask = 1 << j
    j += 1
}

Здесь - ссылка о циклах и потоке управления в Swift 5.

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