rob*_*sia 0 javascript python perl bitwise-operators
我们需要将Javascript哈希算法转换为Perl代码.因此,我们需要将Javascript的按位移位运算符<<,>>和>>>转换为Perl.到目前为止,我们有进行转换的算法,但由于Javascript按位移位运算符在32位整数上运行,我们还需要在Perl中模拟它.
基于这篇文章/sf/answers/2912724391/,我们了解到我们可以使用ctypes在Python中执行此操作.例如,要将整数左移x位:
import ctypes
print (ctypes.c_int(integer << x ^ 0).value)
Run Code Online (Sandbox Code Playgroud)
我的理解是我们需要使用XS来做到这一点.我的问题是,是否有人有快速解决方案来实施它.我们不知道XS.我们可以开始学习它,但从我的印象来看,学习曲线相当高,可能需要一段时间才能掌握它.当然,非XS解决方案是理想的,如果存在的话.任何解决方案或提示将不胜感激.
由于我们已经有了Python解决方案,我们可以在Python中实现这个模块,然后从Perl中调用它.性能不是真正的问题,因此这种"黑客"是可以接受的,尽管有点不受欢迎.换句话说,我们更愿意仅在Perl中维护整个程序(由几个模块组成).
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
Run Code Online (Sandbox Code Playgroud)
将负数传递给逻辑移位是没有意义的,除非该数字实际上不是数字而是比特集合.鉴于您正在移植散列算法,这很可能.这也意味着你要通过匹配JavaScript来为自己创建大量的额外工作,因为你正在重新创建用于解决Perl中不存在的JavaScript限制的hacks.使用32位无符号值,<<截断使用& 0xFFFFFFFF和>>截断使用应该更简单& 0xFFFFFFFF.