在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位无符号右移的最有效方法是什么?
(format "%08x" (-> 0xf2345678 (unsigned-bit-shift-right 4)))
通过整个过程使用长整型,可以给你想要的答案。你不能只关注低32位,用长整型做你正在做的事情吗? - gfredericks(unsigned-bit-shift-right (bit-and (unchecked-int 0xf2345678) 0xffffffff) 4)
。(实际上,在这里您可能不需要unchecked-int
。) - matt