Re: another operation Aubrey Jaffer 10 Jan 2005 01:38 UTC

 | From: xxxxxx@philips.com
 | Date: Tue, 4 Jan 2005 10:18:14 +0100
 |
 | 1. As it turns out, I frequently need the following operation missing
 | in SRFI-60:
 |
 |         (FOO x) ==> i ; this is not my proposal for the procedure's
 |         name ;-)
 |
 |         i >= 0 is the index of the least significant bit set in
 |         integer x in case x > 0,
 |
 |         or in -x-1 if x < 0. If x = 0 then [choose: i = -1 OR (error
 |         ...) OR i = #f OR ...]
 |
 |            In other words, i = max {k >= 0 : 2^k divides x} for x > 0.

I added log2-binary-factors to SRFI-60.  How about a better name for
it?

			      -=-=-=-=-

log2-binary-factors is a useful function which is simple but non-obvious:

(define (log2-binary-factors n)
  (+ -1 (integer-length (logand n (- n)))))

				 ...

_Function:_ *log2-binary-factors* /n/
    Returns the number of factors of two of integer n. This value is
    also the bit-index of the least-significant `1' bit in n.

(require 'printf)
(do ((idx 0 (+ 1 idx)))
      ((> idx 16))
    (printf "%s(%3d) ==> %-5d %s(%2d) ==> %-5d\n"
            'log2-binary-factors
            (- idx) (log2-binary-factors (- idx))
            'log2-binary-factors
            idx (log2-binary-factors idx)))
-|
log2-binary-factors(  0) ==> -1    log2-binary-factors( 0) ==> -1
log2-binary-factors( -1) ==> 0     log2-binary-factors( 1) ==> 0
log2-binary-factors( -2) ==> 1     log2-binary-factors( 2) ==> 1
log2-binary-factors( -3) ==> 0     log2-binary-factors( 3) ==> 0
log2-binary-factors( -4) ==> 2     log2-binary-factors( 4) ==> 2
log2-binary-factors( -5) ==> 0     log2-binary-factors( 5) ==> 0
log2-binary-factors( -6) ==> 1     log2-binary-factors( 6) ==> 1
log2-binary-factors( -7) ==> 0     log2-binary-factors( 7) ==> 0
log2-binary-factors( -8) ==> 3     log2-binary-factors( 8) ==> 3
log2-binary-factors( -9) ==> 0     log2-binary-factors( 9) ==> 0
log2-binary-factors(-10) ==> 1     log2-binary-factors(10) ==> 1
log2-binary-factors(-11) ==> 0     log2-binary-factors(11) ==> 0
log2-binary-factors(-12) ==> 2     log2-binary-factors(12) ==> 2
log2-binary-factors(-13) ==> 0     log2-binary-factors(13) ==> 0
log2-binary-factors(-14) ==> 1     log2-binary-factors(14) ==> 1
log2-binary-factors(-15) ==> 0     log2-binary-factors(15) ==> 0
log2-binary-factors(-16) ==> 4     log2-binary-factors(16) ==> 4