How to zero every n-bit from a number if that bit is 1 in Swift

1 Answer

0 votes
import Foundation

/*
    zeroBitsEveryStep(number, step)
    -------------------------------
    Zeros every `step`-th bit (0-based from LSB)
    but only if that bit is currently 1.

    Example:
        number = 536_870_911
        step = 3  → zero bits 0, 3, 6, 9, ...
*/
func zeroBitsEveryStep(_ number: Int32, step: Int) -> Int32 {
    var result = number
    var pos = 0

    while pos < 32 {
        let mask: Int32 = 1 << Int32(pos)

        // If the bit is 1, zero it
        if (result & mask) != 0 {
            result &= ~mask
        }

        pos += step
    }

    return result
}

/*
    printBinary(n)
    --------------
    Prints a 32-bit binary representation of an integer.
*/
func printBinary(_ n: Int32) {
    let s = String(n, radix: 2).leftPadding(toLength: 32, withPad: "0")
    let grouped = stride(from: 0, to: 32, by: 4)
        .map { i in
            let start = s.index(s.startIndex, offsetBy: i)
            let end   = s.index(start, offsetBy: 4)
            return String(s[start..<end])
        }
        .joined(separator: " ")

    print(grouped)
}

/*
    Helper extension for left-padding strings
*/
extension String {
    func leftPadding(toLength: Int, withPad: String) -> String {
        if self.count >= toLength { return self }
        return String(repeating: withPad, count: toLength - self.count) + self
    }
}

//
// Main program
//
let number: Int32 = 536_870_911   // 0001 1111 1111 1111 1111 1111 1111 1111
let step = 3                      // zero bits 0, 3, 6, 9, ...

print("Original number in binary:")
printBinary(number)

let result = zeroBitsEveryStep(number, step: step)

print("\nNumber after zeroing every \(step) bits (only if bit was 1):")
printBinary(result)

print("\nResult as integer: \(result)")



/*
run:

Original number in binary:
0001 1111 1111 1111 1111 1111 1111 1111

Number after zeroing every 3 bits (only if bit was 1):
0001 0110 1101 1011 0110 1101 1011 0110

Result as integer: 383479222

*/

 



answered 13 hours ago by avibootz
...