这是我想要的行为:
user> (bit-get 4 2)
> 1
我知道使用bit-test
可以很容易地做到这一点,即:
(defn bit-get [x n]
(if (bit-test x n) 1 0))
但我很好奇是否已有任何东西。它可能对我来说有点小,但它似乎不是最佳的(但是最低限度)必须测试某些东西是0
还是1
,然后返回它们是否是{{1基于该测试,或0
。所以,我也很高兴听到在这里切断中间人的任何方法,无论Clojure或Java世界中是否有任何先前制作的1
函数。或许我首先弄错了,关于编译或运行时优化的一些事情使我上面的bit-get
函数实际上不必运行测试只是为了返回它正在测试的值?或者 - 看到我对于按位运算符中涉及的时序/速度优化几乎一无所知 - 也许它似乎只是次优,但实际上是出于某种原因这样做的最快方式?
答案 0 :(得分:5)
编译器无法说出任何关于优化的信息(虽然如果能够改变你的bit-get
代码的话会很惊讶,但是 - 为了自己动手 - 你可以依赖于较低级别的逻辑操作bit-shift-right
和bit-and
,例如:
(defn bit-get [x n]
(bit-and (bit-shift-right x n) 1))