Advertisement
Guest User

Untitled

a guest
Aug 18th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. (defvar *byte-buffer* nil)
  2. (defvar *bit-buffer* nil)
  3.  
  4. (defstruct (bit-buffer (:conc-name nil))
  5. (buffer-size 0)
  6. (buffer-data 0))
  7.  
  8. (defun take-bit ()
  9. (with-slots (buffer-size buffer-data) *bit-buffer*
  10. (unless (plusp buffer-size)
  11. (error "buffer is empty"))
  12. (prog1 (ldb (byte 1 (1- buffer-size)) buffer-data)
  13. (setf buffer-data (ldb (byte (1- buffer-size) 0) buffer-data))
  14. (decf buffer-size))))
  15.  
  16. (defun put-bit (bit)
  17. (unless (or (= 0 bit)
  18. (= 1 bit))
  19. (error "value is not a bit: ~A" bit))
  20. (with-slots (buffer-size buffer-data) *bit-buffer*
  21. (setf buffer-data (logior (ash bit buffer-size)
  22. buffer-data))
  23. (incf buffer-size)))
  24.  
  25. (defun read-bit ()
  26. (with-slots (buffer-size buffer-data) *bit-buffer*
  27. (if (plusp buffer-size)
  28. (take-bit)
  29. (progn
  30. (let ((byte (fast-io:fast-read-byte *byte-buffer*)))
  31. (prog1 (ldb (byte 1 7) byte)
  32. (setf buffer-data (ldb (byte 7 0) byte))
  33. (setf buffer-size 7)))))))
  34.  
  35. (defun read-bits (count
  36. &key
  37. (endian :be)
  38. (signed nil))
  39. (let ((unsigned-res
  40. (ecase endian
  41. (:be
  42. (loop
  43. :repeat count
  44. :for bit := (read-bit)
  45. :for res := bit :then (logior (ash res 1) bit)
  46. :finally
  47. (return res)))
  48. (:le
  49. (loop
  50. :for i :from 0 :below count
  51. :for bit := (read-bit)
  52. :for res := bit :then (logior (ash bit i) res)
  53. :finally
  54. (return res))))))
  55. (if (and signed
  56. (logbitp (1- count) unsigned-res))
  57. (- (ldb (byte (1- count) 0) unsigned-res))
  58. unsigned-res)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement