How to reverse the bits of a number in Swift

1 Answer

0 votes
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

*/

 



answered Apr 4 by avibootz
...