2

这是我想要的行为:

user> (bit-get 4 2)
> 1

我知道这可以很容易地使用bit-test,即:

(defn bit-get [x n]
  (if (bit-test x n) 1 0))

但我很好奇那里是否已经有任何东西。0这对我来说可能有点小气,但是必须测试某物是否是or 1,然后根据该测试返回它是否是0or ,这似乎不是最理想的(尽管如此) 。1所以,我也很高兴听到这里有什么方法可以去掉中间人,不管bit-get在 Clojure 或 Java 世界中是否有任何以前制作的函数。或者也许我一开始就弄错了,关于编译或运行时优化的一些事情让我bit-get上面的函数实际上不必运行测试只是为了返回它正在测试的值?或者 - 看到我对按位运算符中涉及的时序/速度优化几乎一无所知 - 也许它似乎只是次优,但实际上是出于某种原因最快的方法?

4

1 回答 1

6

不能说编译器的优化(尽管如果它能够对您的bit-get代码进行很多更改,我会感到惊讶),但是 - 把事情掌握在自己手中 - 你可以只依赖较低级别的逻辑操作bit-shift-rightbit-and,例如:

(defn bit-get [x n]
  (bit-and (bit-shift-right x n) 1))
于 2013-11-20T08:55:13.523 回答