有点功能吗?

Omr*_*ein 1 bit-manipulation clojure clojure-java-interop

这是我想要的行为:

user> (bit-get 4 2)
> 1
Run Code Online (Sandbox Code Playgroud)

我知道这可以超级轻松地使用bit-test,即:

(defn bit-get [x n]
  (if (bit-test x n) 1 0))
Run Code Online (Sandbox Code Playgroud)

但我很好奇是否已有任何东西.它可能对我来说有点小,但它似乎不是最佳(但是最低限度)必须测试某些东西是否,0或者1然后返回它们是否是0或者1基于该测试.因此,我也很高兴听到有任何方法可以在这里切断中间人,无论bit-getClojure或Java世界中是否有任何以前制作的功能.或许我首先弄错了,关于编译或运行时优化的一些事情使我bit-get上面的函数实际上不必运行测试只是为了返回它正在测试的值?或者 - 看到我对于按位运算符中涉及的时序/速度优化几乎一无所知 - 也许它似乎只是次优,但实际上是出于某种原因实现它的最快方式?

xsc*_*xsc 5

不能说编译器有关优化的任何事情(虽然如果它能够改变很多关于你的bit-get代码的话我会感到惊讶),但是 - 把事情掌握在你自己手中 - 你可以只依靠较低级别的逻辑操作bit-shift-right并且bit-and,例如:

(defn bit-get [x n]
  (bit-and (bit-shift-right x n) 1))
Run Code Online (Sandbox Code Playgroud)