【发布时间】:2016-01-21 02:07:01
【问题描述】:
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"
但是,这对于负数的unsigned right-shifting 来说是个问题:
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)))通过在整个过程中使用 long 为您提供所需的答案。有什么原因你不能在你正在做的事情上使用 long,也许只关注低 32 位? -
一种可能性:在移位之前显式屏蔽您的 int,这样它就不会变成负的 64 位 val:
(unsigned-bit-shift-right (bit-and (unchecked-int 0xf2345678) 0xffffffff) 4)。 (实际上你在这里可能不需要unchecked-int。)
标签: clojure bit-shift signedness