ある整数値から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"