Karakuri.com

Fintechではたらくアプリケーションエンジニアの技術録

Swiftでバイト配列(UInt8配列)の変数どうしで論理演算XORを計算する方法

Swiftで[UInt8]のままXORをする必要がありました。しかしSwiftのXOR演算子は「^」であり、下記のように書いてもコンパイルエラーとなります。

let first: [UInt8] = [0xff, 0x10, 0xa0]
let second: [UInt8] = [0x01, 0x02, 0x03]
let result: [UInt8] = first ^ second

まあ、当然ですね。「^」演算子を使う場合はInt型の変数である必要があります。

ループでUInt8ペアを全てXORすればいい

かといって、[UInt8]を10進数に変換して演算子を使ってXORすると、Int型から[UInt8]に戻すのが大変です。しばらく格闘してみましたが、挫折しました。で、息抜きしていたら「UInt8ペアをXORしていけばいいやん」と気づきました。

public static func xor(first: [UInt8], second: [UInt8]) -> [UInt8] {
    var answer = [UInt8](repeating: 0x00, count: first.count)
        
    for index in 0..<first.count {
        answer[index] = first[index] ^ second[index]
    }
        
    return answer
}

いやほんとプログラミングの成果って時間に比例しないですねー。息抜きしたり休んだほうが圧倒的に短い時間で仕事終わったりしてしまう。。。