Elixir/why中的左旋按位运算是否缺少带符号的左移?

Left rotation bitwise operation in Elixir/why is the signed left shift missing?

免责声明:我在按位操作方面非常天真,因此不胜感激。

我基本上是在尝试在 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)) 在每种语言中提供了不同的结果 - 所以我想我犯了一个错误。

如果有人可以提供 hand/explain 我在这里遗漏的东西(我假设这个运算符不存在是有原因的),我们将不胜感激。我已尝试涵盖所有内容,以防是由于特定数字等原因造成的,但如果我遗漏了任何重要内容,请告诉我。

还有;如果 Elixir 无法实现,我非常乐意转向 Erlang。提前致谢!

您想使用 the Bitwise module:

iex(1)> use Bitwise
nil
iex(2)> 3 <<< 8 ||| 3 >>> (64 - 8)
768