Mar*_*son 20
这是一种合理快速的方法:将数字转换为二进制字符串,然后将结果重新解释为基数4.现在要确保所有'1'都正确加倍,将结果乘以3.
>>> x = 9
>>> bin(x)
'0b1001'
>>> y = int(bin(x)[2:], 4)*3
>>> bin(y)
'0b11000011'
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 16
(参考http://graphics.stanford.edu/~seander/bithacks.html#Interleave64bitOps):
如果您的电话号码低于256,您可以使用
@magic
def double_digits_holger8(x):
m = (x * 0x0101010101010101 & 0x8040201008040201) * 0x0102040810204081
return ((m >> 49) & 0x5555) | ((m >> 48) & 0xAAAA)
Run Code Online (Sandbox Code Playgroud)
如果它低于65536,
@more_magic
def double_digits_binmag16(x):
x = (x | x << 8) & 0x00FF00FF
x = (x | x << 4) & 0x0F0F0F0F
x = (x | x << 2) & 0x33333333
x = (x | x << 1) & 0x55555555
return x | x << 1
Run Code Online (Sandbox Code Playgroud)
与其他解决方案的比较(函数必须采用整数并返回一个整数以进行公平比较):
Method Time per 256 calls
--------------------------------
Do nothing 46.2 usec
Holger8 256 usec
BinMag16 360 usec
Mark 367 usec # http://stackoverflow.com/questions/2928886/doubling-binary-digits/2929198#2929198
Max 720 usec # http://stackoverflow.com/questions/2928886/doubling-binary-digits/2928938#2928938
Peter 1.08 msec # http://stackoverflow.com/questions/2928886/doubling-binary-digits/2928973#2928973
Phiµµ w/o Log 1.11 msec # http://stackoverflow.com/questions/2928886/doubling-binary-digits/2929106#2929106
Jim16 1.26 msec # http://stackoverflow.com/questions/2928886/doubling-binary-digits/2929038#2929038
Elegant 1.66 msec # int(''.join([''.join(i) for i in zip(X,X)]),2)
More Elegant 2.05 msec # int(''.join(chain(*zip(X, X))), 2)
Run Code Online (Sandbox Code Playgroud)
基准源代码可以在http://gist.github.com/417172中找到.
Pet*_*ley 11
使用整数运算的简单解决方案是:
def doubledigits(n):
result = 0
power = 1
while n > 0:
if n%2==1:
result += 3*power
power *= 4
n //= 2
return result
Run Code Online (Sandbox Code Playgroud)