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-get
Clojure或Java世界中是否有任何以前制作的功能.或许我首先弄错了,关于编译或运行时优化的一些事情使我bit-get
上面的函数实际上不必运行测试只是为了返回它正在测试的值?或者 - 看到我对于按位运算符中涉及的时序/速度优化几乎一无所知 - 也许它似乎只是次优,但实际上是出于某种原因实现它的最快方式?
不能说编译器有关优化的任何事情(虽然如果它能够改变很多关于你的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)