(Previous discussion continued) Re: another operation Aubrey Jaffer 10 Jan 2005 01:38 UTC

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.

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

```