Hi all,
I'm implementing Google's protocol buffers in Gambit-C. One of the basic data types is a "varint" which represents a 64-bit integer as a variable number of bytes in a byte stream.
This is the first time I've tried to "decode" data from a byte stream as a signed number in Scheme. In other programming languages that don't have bignums I would have relied on integer overflow and done something like: `(+ 1 (bitwise-not value))'. Has anyone else tried to do something like this before? Is there a better way?
I fiddled around with various approaches and ended up with this:
(define (negative-64bit-value value) (copy-bit-field 63 0 value -1))
Which is used in the following way:
;; This value was accumulated by folding bytes from a stream into an ;; accumulator. The seed value was zero and each byte was added to ;; the accumulator after being aligned by ARITHMETIC-SHIFT. It is not ;; known whether the value should be positive or negative until the ;; last byte in the sequence is read from the stream. (define accumulated-value #x7fffffffffffffffffff) ;; => 604462909807314587353087
(negative-64bit-value accumulated-value) ;; => -1
Thanks,
-Ben