代码之家  ›  专栏  ›  技术社区  ›  Nate

python int到binary?

  •  386
  • Nate  · 技术社区  · 16 年前

    在python中,是否有任何隐藏的python方法可以将整数(或long)转换为二进制字符串?

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

    28 回复  |  直到 6 年前
        1
  •  557
  •   OrenIshShalom    7 年前

    python的字符串格式方法可以采用格式规范。

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

    Format spec docs for Python 2

    Format spec docs for Python 3

        2
  •  373
  •   Akseli Palén Greg Rogers    12 年前

    如果你在找 bin() 相当于 hex() ,它是在python 2.6中添加的。

    例子:

    >>> bin(10)
    '0b1010'
    
        3
  •  55
  •   paxdiablo    7 年前

    蟒蛇 已经为此内置了一些功能,例如 '{0:b}'.format(42) ,它将为您提供 42 101010 .


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

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

    它将基于十进制值构造二进制字符串,假设python还没有更简单的方法。

    一般的想法是使用(按优先顺序)中的代码:

    • 语言或内置库。
    • 具有适当许可证的第三方图书馆。
    • 你自己的收藏。
    • 您需要编写一些新的内容(并保存在自己的集合中以备以后使用)。
        4
  •  36
  •   kctong529    11 年前

    作为参考:

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

    此函数可以转换一个正整数,最大为 18446744073709551615 ,表示为字符串 '1111111111111111111111111111111111111111111111111111111111111111' .

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

        5
  •  33
  •   Martin Thoma    8 年前

    如果需要不带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'
    

    或者,如果您更喜欢功能:

    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)
    
        6
  •  14
  •   Aziz Alto    9 年前

    一个班轮 兰姆达 :

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

    测试:

    >>> 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
    
        7
  •  11
  •   Xiang    9 年前

    一个简单的方法是使用字符串格式,请参见 page .

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

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

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

    如果需要两个补码,则可以使用以下行:

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

    其中n是二进制字符串的宽度。

        8
  •  9
  •   BobStein-VisiBone    8 年前

    备选方案概要:

    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 . 还有马提金·彼得斯。

        9
  •  5
  •   Reza Abtin    9 年前

    另一种解决方案是使用另一种算法,使用位运算符。

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

    更快的版本,无需反转字符串。

    def int2bin(val):
       res=''
       while val>0:
           res = chr((val&1) + 0x30) + res
           val=val>>1    
       return res 
    
        10
  •  4
  •   Van Gale    16 年前

    除非我误解了你所说的二进制字符串的意思,否则我认为你要找的模块是 struct

        11
  •  4
  •   pitfall    9 年前

    使用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)
    
        12
  •  4
  •   Martin Tournoij ravi.zombie    8 年前
    def binary(decimal) :
        otherBase = ""
        while decimal != 0 :
            otherBase  =  str(decimal % 2) + otherBase
            decimal    //=  2
        return otherBase
    
    print binary(10)
    

    输出:

    一千零一十

        13
  •  4
  •   grepit    6 年前

    这是针对Python3的,它保持前导零!

    print(format(0, '08b'))
    

    enter image description here

        14
  •  3
  •   quents    11 年前

    这是我刚刚实现的代码。这不是一个 方法 但你可以把它当作 准备使用功能 !

    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
    
        15
  •  3
  •   user210021    10 年前

    下面是使用divmod()函数的简单解决方案,该函数返回不带分数的除法的提示和结果。

    def dectobin(number):
        bin = ''
        while (number >= 1):
            number, rem = divmod(number, 2)
            bin = bin + str(rem)
        return bin
    
        16
  •  3
  •   Mihai Maruseac Vitor Yudi Hansen    10 年前
    n=input()
    print(bin(n).replace("0b", ""))
    
        17
  •  3
  •   HKC72    7 年前

    具有DEC、BIN、HEX所有必要功能的计算器: (用python 3.5制作并测试)

    您可以更改输入测试编号并获取转换后的编号。

    # 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')
    
        18
  •  2
  •   Chandler    11 年前

    有点类似的解决方案

    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 
    
        19
  •  2
  •   ergonaut    9 年前

    这里还有另一种使用常规数学的方法,不使用循环,只使用递归。(一般情况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']
    
        20
  •  2
  •   DeanM    6 年前

    对于需要将有符号整数(range-2**(digits-1)转换为2**(digits-1)-1)到2的补码二进制字符串的人,这是有效的:

    def int2bin(integer, digits):
    if integer >= 0:
        return bin(integer)[2:].zfill(digits)
    else:
        return bin(2**digits + integer)[2:]
    

    这产生:

    >>> int2bin(10, 8)
    '00001010'
    >>> int2bin(-10, 8)
    '11110110'
    >>> int2bin(-128, 8)
    '10000000'
    >>> int2bin(127, 8)
    '01111111'
    
        21
  •  1
  •   kcrisman    8 年前

    如果你愿意放弃“纯”巨蟒而获得大量火力, there is Sage - example here :

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

    您会注意到它以字符串的形式返回,所以要将它用作一个数字,您需要执行如下操作

    sage: eval('0b'+b)
    15
    
        22
  •  1
  •   Tom Wyllie    7 年前
    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")
    
        23
  •  1
  •   Rajesh Kumar Sahoo    7 年前

    要计算二进制数:

    print("Binary is {0:>08b}".format(16))
    

    计算一个数的十六进制 :

    print("Hexa Decimal is {0:>0x}".format(15))
    

    要计算16之前的所有二进制数:

    for i in range(17):
       print("{0:>2}: binary is {0:>08b}".format(i))
    

    计算到17的十六进制数

     for i in range(17):
        print("{0:>2}: Hexa Decimal is {0:>0x}".format(i))
    ##as 2 digit is enogh for hexa decimal representation of a number
    
        24
  •  1
  •   Galle He    7 年前

    我发现了一种使用矩阵运算将十进制转换为二进制的方法。

    import numpy as np
    E_mat = np.tile(E,[1,M])
    M_order = pow(2,(M-1-np.array(range(M)))).T
    bindata = np.remainder(np.floor(E_mat /M_order).astype(np.int),2)
    

    E 是输入的十进制数据, M 是二进制顺序。 bindata 是输出二进制数据,其格式为1乘m二进制矩阵。

        25
  •  1
  •   Skiller Dz    7 年前

    你可以这样做:

    bin(10)[2:]
    

    或:

    f = str(bin(10))
    c = []
    c.append("".join(map(int, f[2:])))
    print c
    
        26
  •  1
  •   Sandu Ursu    6 年前
    >>> format(123, 'b')
    '1111011'
    
        27
  •  0
  •   Kyle Siopiolosz    11 年前

    与尤素夫·亚齐兹的回答类似

    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]
    

    我对它进行了调整,使唯一被变异的变量是结果(当然是n)。

    如果您需要在其他地方使用此函数(即让另一个模块使用结果),请考虑以下调整:

    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将是你的 标记值 指示转换失败。(假设您只转换正数,不管它们是整数还是长整数)。

        28
  •  0
  •   Spencer Layland    8 年前

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

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