我在回答另一个问题时看到了一个有趣的技巧,我想更好地理解它。

给定一个无符号64位整数,我们感兴趣的是以下位:

1.......2.......3.......4.......5.......6.......7.......8.......

具体来说,我们希望将它们移到前8位,如下所示:

12345678........................................................

我们不关心由。表示的位的值,它们也不需要被保存。

解决方案是屏蔽不需要的位,并将结果乘以0x2040810204081。事实证明,这是有效的。

这个方法有多普遍?这种技术可以用来提取比特的任何子集吗?如果不是,如何确定该方法是否适用于特定的比特集?

最后,如何找到(a?)正确的乘数来提取给定的比特?

例如,乘法和除法可以使用位运算符来实现

i*2 = i<<1
i*3 = (i<<1) + i;
i*10 = (i<<3) + (i<<1)

等等。

用say (i<<3)+(i<<1)乘10是否比直接用i*10更快?有没有什么输入是不能用这种方法乘或除的?

我想创建一系列长度不同的列表。每个列表将包含相同的元素e,重复n次(其中n =列表的长度)。

我如何创建列表,而不使用列表理解[e为xrange(n)中的数字]为每个列表?