bitmap.ss
(module bitmap mzscheme
  (require (lib "list.ss"))
  (provide (all-defined))
  
  (define empty-bitmap 0)
  
  (define (bitmap-add a-bm k)
    (bitwise-ior a-bm (arithmetic-shift 1 k)))
  (define (bitmap-rem a-bm k)
    (bitwise-and a-bm (bitwise-not (arithmetic-shift 1 k))))
  (define (bitmap-on? a-bm k)
    (= 1 (arithmetic-shift (bitwise-and a-bm (arithmetic-shift 1 k)) (* -1 k))))
  
  (define (bitmap->list a-bm a-list)
    (let loop ([i (sub1 (length a-list))]
               [result empty])
      (if (< i 0)
          result          
          (loop (sub1 i) 
                (if (bitmap-on? a-bm (add1 i))
                    (list* (list-ref a-list i) result)
                    result))))))