import Foundation
func reverseBits(_ n: UInt32) -> UInt32 {
let bin = String(n, radix: 2).leftPadding(toLength: 32, withPad: "0")
let rev = String(bin.reversed())
return UInt32(rev, radix: 2)!
}
func bits(_ n: UInt32) -> String {
let bin = String(n, radix: 2).leftPadding(toLength: 32, withPad: "0")
return stride(from: 0, to: 32, by: 8)
.map { i in
let start = bin.index(bin.startIndex, offsetBy: i)
let end = bin.index(start, offsetBy: 8)
return String(bin[start..<end])
}
.joined(separator: " ")
}
extension String {
func leftPadding(toLength: Int, withPad: String) -> String {
if self.count >= toLength { return self }
return String(repeating: withPad, count: toLength - self.count) + self
}
}
let a: UInt32 = 19
let b: UInt32 = 3
let ra = reverseBits(a)
let rb = reverseBits(b)
print("Original 19: \(bits(a))")
print("Reversed 19: \(bits(ra))")
print()
print("Original 3: \(bits(b))")
print("Reversed 3: \(bits(rb))")
/*
run:
Original 19: 00000000 00000000 00000000 00010011
Reversed 19: 11001000 00000000 00000000 00000000
Original 3: 00000000 00000000 00000000 00000011
Reversed 3: 11000000 00000000 00000000 00000000
*/