Python int二进制?

有没有任何Python的方法来将整数(或长)转换为Python中的二进制string?

Google上有很多dec2bin()函数…但是我希望我可以使用一个内置的函数/库。

Python的string格式方法可以采用格式规范。

>>> "{0:b}".format(37) '100101' 

为Python 2格式规格文档

为Python 3格式化规格文档

如果你正在寻找bin()作为hex()的等价物,那它就是在Python 2.6中添加的。

例:

 >>> bin(10) '0b1010' 

Python实际上已经有了一些内置的function,比如'{0:b}'.format(42) ,它会给你42101010的位模式。


对于一个更普遍的哲学,没有任何语言或图书馆会给他们的用户基础一切他们的愿望。 如果你在一个不能提供你需要的环境中工作,你应该在开发过程中收集代码片段,以确保你不必再次写同样的东西。 如,例如:

 def int2bin(i): if i == 0: return "0" s = '' while i: if i & 1 == 1: s = "1" + s else: s = "0" + s i /= 2 return s 

这将构build基于十进制值的二进制string,假设Python还没有更简单的方法。

总体思路是使用代码(按优先顺序):

  • 语言或内置库。
  • 具有合适许可证的第三方库。
  • 你自己的collections。
  • 你需要写一些新的东西(并保存在你自己的collections中以备后用)。

作为参考:

 def toBinary(n): return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1]) 

这个函数可以转换一个大到18446744073709551615的正整数,表示为string'1111111111111111111111111111111111111111111111111111111111111111'

它可以被修改为服务一个更大的整数,虽然它可能不如"{0:b}".format()bin()

如果你想要一个没有0b-前缀的文本表示,你可以使用这个:

 get_bin = lambda x: format(x, 'b') print(get_bin(3)) >>> '11' print(get_bin(-3)) >>> '-11' 

当你想要一个n位表示:

 get_bin = lambda x, n: format(x, 'b').zfill(n) >>> get_bin(12, 32) '00000000000000000000000000001100' >>> get_bin(-12, 32) '-00000000000000000000000000001100' 

另外,如果你喜欢有一个function:

 def get_bin(x, n=0): """ Get the binary representation of x. Parameters ---------- x : int n : int Minimum number of digits. If x needs less digits in binary, the rest is filled with zeros. Returns ------- str """ return format(x, 'b').zfill(n) 

lambda单线程

 >>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2) 

testing:

 >>> binary(5) '101' 

编辑

但是之后 :(

 t1 = time() for i in range(1000000): binary(i) t2 = time() print(t2 - t1) # 6.57236599922 

相比

 t1 = time() for i in range(1000000): '{0:b}'.format(i) t2 = time() print(t2 - t1) # 0.68017411232 

一个简单的方法是使用string格式,请参阅此页面 。

 >> "{0:b}".format(10) '1010' 

如果你想有一个固定长度的二进制string,你可以使用这个:

 >> "{0:{fill}8b}".format(10, fill='0') '00001010' 

如果需要二进制补码,则可以使用以下行:

 '{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n) 

其中n是二进制string的宽度。

替代scheme摘要:

 n=42 assert "-101010" == format(-n, 'b') assert "-101010" == "{0:b}".format(-n) assert "-101010" == (lambda x: x >= 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:])(-n) assert "0b101010" == bin(n) assert "101010" == bin(n)[2:] # But this won't work for negative numbers. 

贡献者包括John Fouhy , Tung Nguyen , mVChr , Martin Thoma 。 和Martijn Pieters。

除非我误解你的意思是二进制string,我认为你正在寻找的模块是结构

另一种解决scheme是使用按位运算符的另一种algorithm。

 def int2bin(val): res='' while val>0: res += str(val&1) val=val>>1 # val=val/2 return res[::-1] # reverse the string 

一个更快的版本,不反转string。

 def int2bin(val): res='' while val>0: res = chr((val&1) + 0x30) + res val=val>>1 return res 
 def binary(decimal) : otherBase = "" while decimal != 0 : otherBase = str(decimal % 2) + otherBase decimal //= 2 return otherBase print binary(10) 

输出:

1010

这是我刚刚实现的代码。 这不是一个方法,但你可以使用它作为一个准备使用的function

 def inttobinary(number): if number == 0: return str(0) result ="" while (number != 0): remainder = number%2 number = number/2 result += str(remainder) return result[::-1] # to invert the string 

这里是简单的解决scheme,使用divmod()函数返回提醒和分数的结果没有分数。

 def dectobin(number): bin = '' while (number >= 1): number, rem = divmod(number, 2) bin = bin + str(rem) return bin 
 n=input() print(bin(n).replace("0b", "")) 

使用numpy pack / unpackbits,他们是你最好的朋友。

 Examples -------- >>> a = np.array([[2], [7], [23]], dtype=np.uint8) >>> a array([[ 2], [ 7], [23]], dtype=uint8) >>> b = np.unpackbits(a, axis=1) >>> b array([[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8) 

有点类似的解决scheme

 def to_bin(dec): flag = True bin_str = '' while flag: remainder = dec % 2 quotient = dec / 2 if quotient == 0: flag = False bin_str += str(remainder) dec = quotient bin_str = bin_str[::-1] # reverse the string return bin_str 

这是另一种使用常规math的方法,没有循环,只有recursion。 (微不足道的情况下0什么也没有返回)。

 def toBin(num): if num == 0: return "" return toBin(num//2) + str(num%2) print ([(toBin(i)) for i in range(10)]) ['', '1', '10', '11', '100', '101', '110', '111', '1000', '1001'] 

如果你愿意放弃“纯粹的”Python而获得大量的火力, 这里就有贤者 – 例子 :

 sage: a = 15 sage: a.binary() '1111' 

你会注意到它作为一个string返回,所以要用它作为一个数字,你会想要做类似的事情

 sage: eval('0b'+b) 15 
 try: while True: p = "" a = input() while a != 0: l = a % 2 b = a - l a = b / 2 p = str(l) + p print(p) except: print ("write 1 number") 

计算器与DEC,BIN,HEX所有必要的function:(使用Python 3.5进行testing)

您可以更改inputtesting号码并获得转换的号码。

 # CONVERTER: DEC / BIN / HEX def dec2bin(d): # dec -> bin b = bin(d) return b def dec2hex(d): # dec -> hex h = hex(d) return h def bin2dec(b): # bin -> dec bin_numb="{0:b}".format(b) d = eval(bin_numb) return d,bin_numb def bin2hex(b): # bin -> hex h = hex(b) return h def hex2dec(h): # hex -> dec d = int(h) return d def hex2bin(h): # hex -> bin b = bin(h) return b ## TESTING NUMBERS numb_dec = 99 numb_bin = 0b0111 numb_hex = 0xFF ## CALCULATIONS res_dec2bin = dec2bin(numb_dec) res_dec2hex = dec2hex(numb_dec) res_bin2dec,bin_numb = bin2dec(numb_bin) res_bin2hex = bin2hex(numb_bin) res_hex2dec = hex2dec(numb_hex) res_hex2bin = hex2bin(numb_hex) ## PRINTING print('------- DECIMAL to BIN / HEX -------\n') print('decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n') print('------- BINARY to DEC / HEX -------\n') print('binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n') print('----- HEXADECIMAL to BIN / HEX -----\n') print('hexadec:',hex(numb_hex),'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n') 

沿着优素福Yazici的答案类似的线路

 def intToBin(n): if(n < 0): print "Sorry, invalid input." elif(n == 0): print n else: result = "" while(n != 0): result += str(n%2) n /= 2 print result[::-1] 

我调整它,使唯一的variables是结果(当然n)。

如果您需要在其他地方使用此function(例如,将结果用于其他模块),请考虑以下调整:

 def intToBin(n): if(n < 0): return -1 elif(n == 0): return str(n) else: result = "" while(n != 0): result += str(n%2) n /= 2 return result[::-1] 

所以-1将是你的哨兵价值表明转换失败。 (这是假设你只转换正数,无论是整数还是长整数)。

这是一个简单的二进制到十进制转换器,可以连续循环

 t = 1 while t > 0: binaryNumber = input("Enter a binary No.") convertedNumber = int(binaryNumber, 2) print(convertedNumber) print("")