背景
我们需要将Javascript散列算法转换为Perl代码。因此,我们需要将Javascript的位移位操作符<<、>>和>>>转换为Perl。到目前为止,我们已经有了进行转换的算法,但由于Javascript按位移位运算符对32位整数进行操作,因此我们还需要在Perl中进行模拟。
Python解决方案
基于这篇文章https://stackoverflow.com/a/41610348,我们了解到我们可以使用ctype在Python中做到这一点。例如,要将整数左移x位:
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)
Perl问题
我的理解是我们需要使用XS来做这件事。我的问题是,是否有人有一个快速的解决方案来实现它。我们不知道XS。我们可以开始学习它,但从我的印象来看,学习曲线相当高,可能需要一段时间才能掌握它。当然,如果存在非XS解决方案,那么它将是理想的。任何解决方案或提示都将不胜感激。
解决方法
因为我们已经有了一个Python解决方案,所以我们可以用Python实现这个模块,然后从Perl调用它。性能并不是真正的问题,所以这种"hack“是可以接受的,尽管有些不受欢迎。换句话说,我们倾向于只用Perl来维护整个程序(由几个模块组成)。
发布于 2018-09-17 23:58:05
sub lshr32 { ( $_[0] & 0xFFFFFFFF ) >> $_[1] } # >>> in JS
sub lshl32 { ( $_[0] << $_[1] ) & 0xFFFFFFFF }
sub ashr32 { ( $_[0] - ( $_[0] % ( 1 << $_[1] ) ) ) / ( 1 << $_[1] ) } # >> in JS
sub ashl32 { unpack "l", pack "l", $_[0] * ( 1 << $_[1] ) } # << in JS
将负数传递给逻辑移位是没有意义的,除非该数字实际上不是一个数字,而是位的集合。假设您正在移植一个散列算法,这是很有可能的。这还意味着,通过如此紧密地匹配JavaScript,您将为自己创建大量额外的工作,因为您正在重新创建用于解决JavaScript中不存在的限制的hack。使用32位无符号值、使用& 0xFFFFFFFF
截断<<
和使用& 0xFFFFFFFF
截断>>
应该简单得多。
https://stackoverflow.com/questions/52366418
复制相似问题