Clojure 的位移操作似乎都返回 64 位long
结果,即使对于 32 位int
参数也是如此。这不是一个实质性问题bit-shift-left
:
user=> (format "%08x" (unchecked-int (bit-shift-left (unchecked-int 0x12345678) 4)))
"23456780"
user=> (format "%08x" (unchecked-int (bit-shift-left (unchecked-int 0xf2345678) 4)))
"23456780"
但是,这成为负数无符号右移的问题:
user=> (format "%08x" (unchecked-int (unsigned-bit-shift-right (unchecked-int 0xf2345678) 4)))
"ff234567"
正确的答案当然是0f234567
。
在 Clojure 中实现 32 位无符号右移的最有效方法是什么?