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
*/