* Added fxlength
This commit is contained in:
		
							parent
							
								
									e06b84e75d
								
							
						
					
					
						commit
						82eda09ea0
					
				| 
						 | 
					@ -2838,13 +2838,16 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(library (ikarus bitwise misc)
 | 
					(library (ikarus bitwise misc)
 | 
				
			||||||
  (export bitwise-first-bit-set
 | 
					  (export bitwise-first-bit-set
 | 
				
			||||||
          fxbit-count bitwise-bit-count)
 | 
					          fxbit-count bitwise-bit-count
 | 
				
			||||||
 | 
					          fxlength)
 | 
				
			||||||
  (import 
 | 
					  (import 
 | 
				
			||||||
    (ikarus system $fx)
 | 
					    (ikarus system $fx)
 | 
				
			||||||
    (ikarus system $bignums)
 | 
					    (ikarus system $bignums)
 | 
				
			||||||
 | 
					    (ikarus system $flonums)
 | 
				
			||||||
    (except (ikarus) 
 | 
					    (except (ikarus) 
 | 
				
			||||||
      bitwise-first-bit-set
 | 
					      bitwise-first-bit-set
 | 
				
			||||||
      fxbit-count bitwise-bit-count))
 | 
					      fxbit-count bitwise-bit-count
 | 
				
			||||||
 | 
					      fxlength))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (bitwise-first-bit-set x)
 | 
					  (define (bitwise-first-bit-set x)
 | 
				
			||||||
    (define (byte-first-bit-set x i) 
 | 
					    (define (byte-first-bit-set x i) 
 | 
				
			||||||
| 
						 | 
					@ -2917,6 +2920,19 @@
 | 
				
			||||||
        [(bignum? n) (bnbitcount n)]
 | 
					        [(bignum? n) (bnbitcount n)]
 | 
				
			||||||
        [else (error 'bitwise-bit-count "not an exact integer" n)])))
 | 
					        [else (error 'bitwise-bit-count "not an exact integer" n)])))
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (fxlength x) 
 | 
				
			||||||
 | 
					    (if (fixnum? x) 
 | 
				
			||||||
 | 
					        (let ([fl ($fixnum->flonum
 | 
				
			||||||
 | 
					                    (if ($fx< x 0) ($fxlognot x) x))])
 | 
				
			||||||
 | 
					          (let ([sbe ($fxlogor 
 | 
				
			||||||
 | 
					                       ($fxsll ($flonum-u8-ref fl 0) 4)
 | 
				
			||||||
 | 
					                       ($fxsra ($flonum-u8-ref fl 1) 4))])
 | 
				
			||||||
 | 
					            (cond
 | 
				
			||||||
 | 
					              [($fx= sbe 0) 0]
 | 
				
			||||||
 | 
					              [else ($fx- sbe 1022)])))
 | 
				
			||||||
 | 
					        (error 'fxlength "not a fixnum" x)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -798,7 +798,7 @@
 | 
				
			||||||
    [fxfirst-bit-set                             r fx]
 | 
					    [fxfirst-bit-set                             r fx]
 | 
				
			||||||
    [fxif                                        i r fx]
 | 
					    [fxif                                        i r fx]
 | 
				
			||||||
    [fxior                                       i r fx]
 | 
					    [fxior                                       i r fx]
 | 
				
			||||||
    [fxlength                                    r fx]
 | 
					    [fxlength                                    i r fx]
 | 
				
			||||||
    [fxmax                                       i r fx]
 | 
					    [fxmax                                       i r fx]
 | 
				
			||||||
    [fxmin                                       i r fx]
 | 
					    [fxmin                                       i r fx]
 | 
				
			||||||
    [fxmod                                       i r fx]
 | 
					    [fxmod                                       i r fx]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,5 +63,6 @@
 | 
				
			||||||
(test-fldiv0-and-mod0)
 | 
					(test-fldiv0-and-mod0)
 | 
				
			||||||
(test-fxdiv-and-mod)
 | 
					(test-fxdiv-and-mod)
 | 
				
			||||||
(test-fxdiv0-and-mod0)
 | 
					(test-fxdiv0-and-mod0)
 | 
				
			||||||
 | 
					(test-fxlength)
 | 
				
			||||||
(test-bitwise-bit-count)
 | 
					(test-bitwise-bit-count)
 | 
				
			||||||
(printf "Happy Happy Joy Joy\n")
 | 
					(printf "Happy Happy Joy Joy\n")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(library (tests fixnums)
 | 
					(library (tests fixnums)
 | 
				
			||||||
  (export test-fxdiv-and-mod test-fxdiv0-and-mod0)
 | 
					  (export test-fxdiv-and-mod test-fxdiv0-and-mod0
 | 
				
			||||||
 | 
					          test-fxlength)
 | 
				
			||||||
  (import (ikarus))
 | 
					  (import (ikarus))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (test-fxdiv-and-mod)
 | 
					  (define (test-fxdiv-and-mod)
 | 
				
			||||||
| 
						 | 
					@ -82,5 +83,34 @@
 | 
				
			||||||
    (test (least-fixnum) (greatest-fixnum))
 | 
					    (test (least-fixnum) (greatest-fixnum))
 | 
				
			||||||
    (test (greatest-fixnum) (greatest-fixnum)))
 | 
					    (test (greatest-fixnum) (greatest-fixnum)))
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (test-fxlength)
 | 
				
			||||||
 | 
					    (define (test x)
 | 
				
			||||||
 | 
					      (define (bitlen x)
 | 
				
			||||||
 | 
					        (if (zero? x) 
 | 
				
			||||||
 | 
					            0
 | 
				
			||||||
 | 
					            (+ 1 (bitlen (bitwise-arithmetic-shift-right x 1)))))
 | 
				
			||||||
 | 
					      (define (len x) 
 | 
				
			||||||
 | 
					        (if (< x 0) 
 | 
				
			||||||
 | 
					            (bitlen (bitwise-not x))
 | 
				
			||||||
 | 
					            (bitlen x)))
 | 
				
			||||||
 | 
					      (let ([c0 (len x)]
 | 
				
			||||||
 | 
					            [c1 (fxlength x)])
 | 
				
			||||||
 | 
					        (unless (= c0 c1) 
 | 
				
			||||||
 | 
					          (error 'test-fxlength "failed/expected/got" x c0 c1))))
 | 
				
			||||||
 | 
					    (define (fxtest x)
 | 
				
			||||||
 | 
					      (when (fixnum? x) 
 | 
				
			||||||
 | 
					        (when (zero? (bitwise-and x #xFFFFFFF)) 
 | 
				
			||||||
 | 
					          (printf "fxlength ~s\n" x))
 | 
				
			||||||
 | 
					        (test x) 
 | 
				
			||||||
 | 
					        (fxtest (+ x #x100))))
 | 
				
			||||||
 | 
					    (test 0)
 | 
				
			||||||
 | 
					    (test 1)
 | 
				
			||||||
 | 
					    (test 2)
 | 
				
			||||||
 | 
					    (test 3)
 | 
				
			||||||
 | 
					    (test -1)
 | 
				
			||||||
 | 
					    (test -2)
 | 
				
			||||||
 | 
					    (test -3)
 | 
				
			||||||
 | 
					    (fxtest (least-fixnum)))
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,7 +301,7 @@
 | 
				
			||||||
    [fxfirst-bit-set                            S fx]
 | 
					    [fxfirst-bit-set                            S fx]
 | 
				
			||||||
    [fxif                                       C fx]
 | 
					    [fxif                                       C fx]
 | 
				
			||||||
    [fxior                                      C fx]
 | 
					    [fxior                                      C fx]
 | 
				
			||||||
    [fxlength                                   S fx]
 | 
					    [fxlength                                   C fx]
 | 
				
			||||||
    [fxmax                                      C fx]
 | 
					    [fxmax                                      C fx]
 | 
				
			||||||
    [fxmin                                      C fx]
 | 
					    [fxmin                                      C fx]
 | 
				
			||||||
    [fxmod                                      C fx]
 | 
					    [fxmod                                      C fx]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue