[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

R5RS Proposal proposal (bitvectors)



   From: Pavel Curtis <Pavel@parc.xerox.com>
   Date: 	Tue, 26 May 1992 14:34:33 PDT

      Date:	Tue, 26 May 1992 14:13:57 -0700
      From:	"Michael R. Blair" <ziggy@martigny.ai.mit.edu>

      I just want to be able to have bitvectors and bitwise logical AND
      and OR and NOT and so on. This is partly because I simulate digital
      chips and partly because I am envious of other languages that claim
      high efficiency algorithms by using bitvectors to scoreboard things
      like set operations (union/intersection/etc as OR/AND etc).

   I would prefer not adding a new data-type but rather just
   specifying the various bitwise operations on (exact) integers in
   much the same way Common Lisp does, with integers treated as if
   they were half-infinite two's complement bit sequences.  I'd like
   to see LOGAND, LOGIOR, LOGXOR, and LOGNOT, with the first three
   being binary operators (or perhaps n-ary) and the last being unary,
   all mapping exact integers to exact integers.

   Common Lisp provides both these operations on integers and logical
   operations on (mutable) bit-vectors.  I find the integer variety to
   be much simpler to understand (mainly due to their immutability, I
   think), but I can see the usefulness, in certain contexts, of a
   mutable variety too.  I guess what I'm saying is that I certainly
   want the integer ops and wouldn't squawk too loudly if bit-vectors
   were added too.

SLIB has most of the Common Lisp logical operations implemented in
portable Scheme code.  I find them very useful.  They are used for
modular arithmatic computations and random number generation in SLIB.
I am including the documentation for logical.scm at the end of this
message.

Bitvectors could be implemented in portable scheme code using vectors
or strings for the actual storage.  SLIB would certainly welcome such
code.

----------------------------------------------------------------------
   (logand n1 n2)					procedure
 
 Returns the integer which is the bit-wise AND of the two integer
 arguments.
 
   (logor n1 n2)					procedure
 
 Returns the integer which is the bit-wise OR of the two integer
 arguments.
 
   (logxor n1 n2)					procedure
 
 Returns the integer which is the bit-wise XOR of the two integer
 arguments.
 
   (lognot n)						procedure
 
 Returns the integer which is the 2s-complement of the integer argument.
 
   (ash int count)					procedure
 
 Returns an integer equivalent to
 (inexact->exact (floor (* int (expt 2 count))))
 
   (logcount n)						procedure
 
 Returns the number of bits in integer n.  If integer is positive, the
 1-bits in its binary representation are counted.  If negative, the
 0-bits in its two's-complement binary representation are counted.  If
 0, 0 is returned.
 
   (integer-length n)					procedure
 
 Returns the number of bits neccessary to represent n.
 
   (integer-expt n k)					procedure
 
 Returns n raised to the non-negative integer exponent k.
 
   (bit-extract n <start> <end>)			procedure
 
 Returns the integer composed of the <start> (inclusive) through <end>
 (exclusive) bits of n.  The <start>th bit becomes the 0-th bit in
 the result.

Common Lispers will notice that I have not supported the multiple
(more than 2) argument forms of logand, logor, and logxor.  I don't
care if you include them.