Fastest way to turn 4 bytes into a 32 bit number?
I have 4 bytes, each 8 bits long. I wish to turn these into a single 32 bit number. What's the fastest way to do that in LispWorks on Linux? I tried a number of different approaches and looked at the disassemble output and ran some micro benchmarks and the best I could come up with is the PACK-4-BYTES-V0¨function below. Is there a better way? There are some other versions below for your entertainment. Thanks for any tips you might have, Chris Dean (defun pack-4-bytes-v0 (b0 b1 b2 b3) (declare (optimize (speed 3) (debug 0) (space 0) (safety 0) (hcl:fixnum-safety 0) (compilation-speed 0)) (type (unsigned-byte 8) b0 b1 b2 b3)) (the (unsigned-byte 32) (logior (ash b0 24) (ash b1 16) (ash b2 8) b3))) (defun pack-4-bytes-v1 (b0 b1 b2 b3) (declare (optimize (speed 3) (debug 0) (space 0) (safety 0) (hcl:fixnum-safety 0) (compilation-speed 0)) (type (unsigned-byte 8) b0 b1 b2 b3)) (ldb (byte 32 0) (logior (ash b0 24) (ash b1 16) (ash b2 8) b3))) (defun pack-4-bytes-v2 (b0 b1 b2 b3) (declare (optimize (speed 3) (debug 0) (space 0) (safety 0) (hcl:fixnum-safety 0) (compilation-speed 0)) (type (unsigned-byte 8) b0 b1 b2 b3)) (let ((res 0)) (declare (type (unsigned-byte 32) res)) (setf (ldb (byte 8 24) res) b0 (ldb (byte 8 16) res) b1 (ldb (byte 8 8) res) b2 (ldb (byte 8 0) res) b3) res))