These functions operate on the 2’s complement binary representation of an exact integer.
Returns the bit-wise logical inverse of the argument. More formally, returns the exact integer whose two’s complement representation is the one’s complement of the two’s complement representation of
i.
These procedures return the exact integer that is the bit-wise “and”, “inclusive or”, or “exclusive or” of the two’s complement representations of their arguments. If they are passed only one argument, they return that argument. If they are passed no arguments, they return the integer that acts as identity for the operation: -1, 0, or 0, respectively.
Procedure: bitwise-if i1 i2 i3
Returns the exact integer that is the bit-wise “if” of the twos complement representations of its arguments, i.e. for each bit, if it is 1 in i1, the corresponding bit in i2 becomes the value of the corresponding bit in the result, and if it is 0, the corresponding bit in i3 becomes the corresponding bit in the value of the result. This is equivaent to the following computation:
(bitwise-ior (bitwise-and i1 i2) (bitwise-and (bitwise-not i1) i3))
Procedure: bitwise-bit-count i
If ei is non-negative, returns the number of 1 bits in the twos complement representation of i. Otherwise it returns the result of the following computation:
(bitwise-not (bitwise-bit-count (bitwise-not i)))
Returns the number of bits needed to represent i if it is positive, and the number of bits needed to represent
(bitwise-notif it is negative, which is the exact integer that is the result of the following computation:i)(do ((result 0 (+ result 1)) (bits (if (negative? i) (bitwise-not i) ei) (bitwise-arithmetic-shift bits -1))) ((zero? bits) result))This is the number of bits needed to represent
iin an unsigned field.
Procedure: bitwise-first-bit-set i
Returns the index of the least significant 1 bit in the twos complement representation of i. If ei is 0, then - 1 is returned.
(bitwise-first-bit-set 0) ⇒ -1 (bitwise-first-bit-set 1) ⇒ 0 (bitwise-first-bit-set -4) ⇒ 2
Procedure: bitwise-bit-set? i1 i2
Returns
#tif the i2’th bit (wherei2must be non-negative) is 1 in the two’s complement representation ofi1, and#fotherwise. This is the result of the following computation:(not (zero? (bitwise-and (bitwise-arithmetic-shift-left 1 i2) i1)))
Procedure: bitwise-copy-bit i bitno replacement-bit
Return the result of replacing the
bitno’th bit ofibyreplacement-bit, wherebitnomust be non-negative, andreplacement-bitmust be either 0 or 1. This is the result of the following computation:(let* ((mask (bitwise-arithmetic-shift-left 1 bitno))) (bitwise-if mask (bitwise-arithmetic-shift-left replacement-bit bitno) i))
Procedure: bitwise-bit-field n start end
Return the integer formed from the (unsigned) bit-field starting at
startand ending just beforeend. Same as:(let ((mask (bitwise-not (bitwise-arithmetic-shift-left -1end)))) (bitwise-arithmetic-shift-right (bitwise-andnmask)start))
Procedure: bitwise-copy-bit-field to start end from
Returns the result of replacing in
tothe bits at positions fromstart(inclusive) toend(exclusive) by the bits infromfrom position 0 (inclusive) to positionend-start(exclusive). Bothstartandstartmust be non-negative, andstartmust be less than or equal tostart.This is the result of the following computation:
(let* ((mask1 (bitwise-arithmetic-shift-left -1 start)) (mask2 (bitwise-not (bitwise-arithmetic-shift-left -1 end))) (mask (bitwise-and mask1 mask2))) (bitwise-if mask (bitwise-arithmetic-shift-left from start) to))
Procedure: bitwise-arithmetic-shift i j
Shifts
ibyj. It is a “left” shift if, and a “right” shift ifj>0. The result is equal toj<0(floor (*.i(expt 2j)))Examples:
(bitwise-arithmetic-shift -6 -1) ⇒-3 (bitwise-arithmetic-shift -5 -1) ⇒ -3 (bitwise-arithmetic-shift -4 -1) ⇒ -2 (bitwise-arithmetic-shift -3 -1) ⇒ -2 (bitwise-arithmetic-shift -2 -1) ⇒ -1 (bitwise-arithmetic-shift -1 -1) ⇒ -1
Procedure: bitwise-arithmetic-shift-left i amount
Procedure: bitwise-arithmetic-shift-right i amount
The
amountmust be non-negative Thebitwise-arithmetic-shift-leftprocedure returns the same result asbitwise-arithmetic-shift, and(bitwise-arithmetic-shift-rightreturns the same result asiamount)(bitwise-arithmetic-shift;i(-amount))
Procedure: bitwise-rotate-bit-field n start end count
Returns the result of cyclically permuting in
nthe bits at positions fromstart(inclusive) toend(exclusive) bycountbits towards the more significant bits,startandendmust be non-negative, andstartmust be less than or equal toend. This is the result of the following computation:(let* ((n ei1) (width (- end start))) (if (positive? width) (let* ((count (mod count width)) (field0 (bitwise-bit-field n start end)) (field1 (bitwise-arithmetic-shift-left field0 count)) (field2 (bitwise-arithmetic-shift-right field0 (- width count))) (field (bitwise-ior field1 field2))) (bitwise-copy-bit-field n start end field)) n))
Procedure: bitwise-reverse-bit-field i start end
Returns the result obtained from
iby reversing the order of the bits at positions fromstart(inclusive) toend(exclusive), wherestartandendmust be non-negative, andstartmust be less than or equal toend.(bitwise-reverse-bit-field #b1010010 1 4) ⇒ 88 ; #b1011000
Perform one of the 16 bitwise operations of
xandy, depending onop.
Returns true if the arguments have any bits in common. Same as
(not (zero? (bitwise-and, but is more efficient.ij)))
These older functions are still available, but we recommand using the R6RS-compatible functions.
Equivalent to
(bitwise-not.i)
Equivalent to
(bitwise-and.i...)
Equivalent to
(bitwise-ior.i...)
Equivalent to
(bitwise-xor.i...)
Count the number of 1-bits in
i, if it is non-negative. Ifiis negative, count number of 0-bits. Same as(bitwise-bit-countifi)iis non-negative.
Equivalent to
(bitwise-length.i)
Equivalent to
bitwise-bit-set?.ipos)
Procedure: arithmetic-shift i j
Equivalent to
bitwise-arithmetic-shift.ij)
Alias for
arithmetic-shift.
Procedure: bit-extract n start end
Equivalent to
(bitwise-bit-field.nstartend)