免责声明:我在按位运算方面非常天真,因此不胜感激。
我基本上是尝试在 Elixir 中执行左旋转,基于我正在使用的一些等效的 Java(我需要移植一小块)。
public static long rotateLeft(long l, int shift) {
return (l << shift) | l >>> (64 - shift);
}
通常我不会直截了本地说明我的工作是什么,但我认为由于使用了 <<
而它是相关的。运算符(在 Elixir/Erlang 中似乎不存在)。
是否有一些明显的方法可以在 Elixir 中复制我缺少的上述行为?我已经搜索了没有运算符的实现,但似乎大多数其他语言都有它,所以它没有出现在任何地方。确实出现的一件事是X << Y == X * 2 * Y
,所以我这样实现:
def rotate_left(l, shift) when is_number(l) and is_number(shift) do
(l * 2 * shift) ||| l >>> (64 - shift)
end
但是,通过两种语言 (rotate_left(2461839666708829781, 13)
) 运行测试会在每种语言中提供不同的结果 - 所以我想我犯了一个错误。
如果有人可以提供帮助/解释我在这里遗漏的内容(我假设这个运算符不存在是有原因的),我们将不胜感激。我已尝试涵盖所有内容,以防是由于特定数字等原因造成的,但如果我遗漏了任何重要内容,请告诉我。
还有;如果 Elixir 无法实现,我非常乐意转向 Erlang。提前致谢!
最佳答案
您想使用 the Bitwise
module :
iex(1)> use Bitwise
nil
iex(2)> 3 <<< 8 ||| 3 >>> (64 - 8)
768
关于bit-manipulation - Elixir 中的左旋转按位运算/为什么缺少带符号的左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388148/