免责声明:当谈到按位操作时,我非常天真,所以我很感激.
我基本上试图在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.提前致谢!
您想使用该Bitwise
模块:
iex(1)> use Bitwise nil iex(2)> 3 <<< 8 ||| 3 >>> (64 - 8) 768