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