LoginSignup
13
3

More than 5 years have passed since last update.

Swiftで整数から2進数文字列が欲しいときは FixedWidthInteger を使おう

Last updated at Posted at 2018-05-28

ある整数値から2進数でn bitに0埋めした文字列が必要な時があります。

そのような時に、実はAppleの公式ドキュメントにこのような実装が記載されていたのでご紹介します。

FixedWidthInteger.swift
extension FixedWidthInteger {
    var binaryString: String {
        var result: [String] = []
        for i in 0..<(Self.bitWidth / 8) {
            // ビットの右側から見ていって、UInt8の8bit(1byte)からはみ出た部分はtruncatiteする。
            // 自身のビット長によって8bitづつ右側ビットシフトをして、右端8bitづつUInt8にしている
            let byte = UInt8(truncatingIfNeeded: self >> (i * 8))

            // 2進数文字列に変換
            let byteString = String(byte, radix: 2)

            // 8桁(8bit)になるように0 padding
            let padding = String(repeating: "0",
                                 count: 8 - byteString.count)
            // 先頭にパディングを足す
            result.append(padding + byteString)
        }

        // 右端の8ビットが配列の先頭に入っているが、joined()するときは左端の8bitが配列の先頭に来ていて欲しいのでreversed()している
        return "0b" + result.reversed().joined(separator: "_")
    }
}

print(Int16.max.binaryString)
// Prints "0b01111111_11111111"
print((101 as UInt8).binaryString)
// Prints "0b11001001"

もし、先頭の0bも8bitごとの_もいらないなら、

no0b_.swift
return result.reversed().joined()

とすれば、以下のようになります。

no0b_print.swift
print(Int16.max.binaryString)
// Prints "0111111111111111"
print((101 as UInt8).binaryString)
// Prints "11001001"
13
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
3