Component rotate-byte

You are here: All Systems / sb-rotate-byte / rotate-byte

(in-package "SB-ROTATE-BYTE")

(defun rotate-byte (count bytespec integer)
  "Rotates a field of bits within INTEGER; specifically, returns an
integer that contains the bits of INTEGER rotated COUNT times
leftwards within the byte specified by BYTESPEC, and elsewhere
contains the bits of INTEGER."

  (rotate-byte count bytespec integer)
)


(defun %rotate-byte (count size pos integer)
  (let ((count (nth-value 1 (round count size)))
        (mask (1- (ash 1 size)))
)

    (logior (logand integer (lognot (ash mask pos)))
            (let ((field (logand (ash mask pos) integer)))
              (logand (ash mask pos)
                      (if (> count 0)
                          (logior (ash field count)
                                  (ash field (- count size))
)

                          (logior (ash field count)
                                  (ash field (+ count size))
)
)
)
)
)
)
)


(defun %unsigned-32-rotate-byte (count integer)
  ;; inhibit transforms
 (declare (notinline %rotate-byte))
  (%rotate-byte count 32 0 integer)
)

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.