对大量字节进行位运算

4

我正在进行一些简单的文件加密/解密练习,目前只是读入一堆字节并逐个对每个字节执行适当的位操作,然后将它们写入输出文件。

这种方法似乎相当慢。例如,如果我想将每个字节都异或0xFF,我会循环遍历每个字节并异或0xFF,而不是使用某些魔法快速地异或每个字节。

有没有更好的方法来执行位操作,而不是每次一个字节?


1
你目前是怎样存储这些字节的呢?作为整数列表吗?而且,除非你有超过十几兆字节,否则字节表示很不可能是减速的源头。在推测之前,请先进行测量(即分析)。 - phihag
你确定标签应该是加密/解密吗?我在你的问题中没有看到任何加密操作... - Maarten Bodewes
2个回答

7

3
无论如何,每个字节似乎都必须从内存中读取,以某种方式进行修改,并写回到内存中。您可以通过一次操作多个字节来节省一些时间(没有双关语),例如对4或8个字节的整数执行XOR操作,因此将循环管理的开销分为大约4或8倍,但是这种改进可能不会对整体算法产生重大影响。通过使用表格中的预计算值替换CPU/语言的“本地”位操作(XOR、Shifts、Rotations等),可以找到其他改进。但是请注意,这些本机操作通常已经相当优化,而且您必须非常努力地设计外部等效操作,并精确测量这些操作之间的相对性能。

编辑:糟糕,我刚注意到[Python]标签以及另一个回答中关于numpy的参考。
需要注意... 虽然Numpy按位数组建议是有道理的,但这完全取决于实际问题的参数。例如,使用numpy的位运算函数暗示了基础数组的排列可能会浪费相当多的时间。 请参见此Stack Overflow问题,它似乎非常相关。虽然专注于异或操作,但该问题提供了许多可行的提示,可以改进循环等,并进行一般性的分析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接