이진 문자열에 파이썬 int?
파이썬에서 정수 (또는 Long)를 이진 문자열로 변환 할 수있는 통조림 파이썬 방법이 있습니까?
Google에는 무수한 dec2bin () 함수가 있습니다 ...하지만 내장 함수 / 라이브러리를 사용할 수 있기를 바랍니다.
파이썬의 문자열 형식 메소드는 형식 스펙을 취할 수 있습니다.
>>> "{0:b}".format(37)
'100101'
bin()
와 동등한 것으로 찾고 있다면 hex()
파이썬 2.6에 추가되었습니다.
예:
>>> bin(10)
'0b1010'
파이썬은 실제로 않습니다 이미 이것에 대한 내장 무언가가, 같은 작업을 할 수있는 능력 '{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
파이썬에 이미 쉬운 방법이 없다고 가정하면 10 진수 값을 기반으로 이진 문자열을 생성합니다.
일반적인 아이디어는 다음의 코드를 선호하는 순서대로 사용하는 것입니다.
- 언어 또는 내장 라이브러리
- 적합한 라이센스가있는 타사 라이브러리.
- 자신의 컬렉션.
- 새로운 내용을 작성해야합니다 (나중에 자신의 컬렉션에 저장).
참고로 :
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'
또는 기능을 선호하는 경우 :
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)
람다가있는 원 라이너 :
>>> 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
문자열 형식을 사용하는 간단한 방법은이 페이지를 참조 하십시오 .
>> "{0:b}".format(10)
'1010'
이진 문자열의 길이를 고정하려면 다음을 사용할 수 있습니다.
>> "{0:{fill}8b}".format(10, fill='0')
'00001010'
2의 보수가 필요한 경우 다음 라인을 사용할 수 있습니다.
'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)
여기서 n은 이진 문자열의 너비입니다.
대안 요약 :
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.
이것은 파이썬 3 용이며 선행 0을 유지합니다!
print(format(0, '08b'))
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)
이진 문자열의 의미를 오해하지 않는 한 찾고있는 모듈이 구조체 라고 생각합니다.
방금 구현 한 코드는 다음과 같습니다. 이것은 방법이 아니지만 바로 사용할 수있는 기능으로 사용할 수 있습니다 !
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
비트 연산자를 사용하여 다른 알고리즘을 사용하는 또 다른 솔루션입니다.
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
def binary(decimal) :
otherBase = ""
while decimal != 0 :
otherBase = str(decimal % 2) + otherBase
decimal //= 2
return otherBase
print binary(10)
산출:
1010
여기에 divmod () fucntion을 사용하는 간단한 솔루션이 있습니다.이 기능은 미리 알림과 분수없이 나누기의 결과를 반환합니다.
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", ""))
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')
부호있는 정수 (범위 -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'
위의 답변이 주로 format ()을 사용 했으므로 다음은 f-string 구현입니다.
integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')
산출:
00111
편의를 위해 형식화 된 문자열 리터럴에 대한 python 문서 링크는 https://docs.python.org/3/reference/lexical_analysis.html#f-strings 입니다.
다소 비슷한 솔루션
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
다음은 정규 수학을 사용하는 또 다른 방법입니다. 루프는없고 재귀 만 있습니다. (소수점 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']
이진수를 계산하려면 :
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까지 16 진수 10 진수를 계산하려면
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
>>> format(123, 'b')
'1111011'
당신이 "순수한"파이썬을 포기하지만 화력을 많이 확보하고자하는 경우, 세이지가 - 예 여기 :
sage: a = 15
sage: a.binary()
'1111'
문자열로 반환되므로 다음과 같이 원하는 숫자로 사용하십시오.
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")
십진수를 이진수로 변환하는 행렬 연산을 사용하는 방법을 찾았습니다.
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
는 1xM 이진 행렬 형식의 출력 이진 데이터입니다.
당신은 그렇게 할 수 있습니다 :
bin(10)[2:]
또는 :
f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c
numpy.binary_repr(num, width=None)
위의 문서 링크의 예 :
>>> np.binary_repr(3) '11' >>> np.binary_repr(-3) '-11' >>> np.binary_repr(3, width=4) '0011'
입력 숫자가 음수이고 너비가 지정되면 2의 보수가 반환됩니다.
>>> np.binary_repr(-3, width=3) '101' >>> np.binary_repr(-3, width=5) '11101'
Yusuf 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]
나는 돌연변이되는 유일한 변수가 결과 (물론 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은 전환이 실패했음을 나타내는 센티넬 값 입니다. (정수이든 정수 든 양수 만 변환한다고 가정합니다).
다음은 지속적으로 반복되는 간단한 이진수를 10 진수로 변환하는 변환기입니다.
t = 1
while t > 0:
binaryNumber = input("Enter a binary No.")
convertedNumber = int(binaryNumber, 2)
print(convertedNumber)
print("")
참고 URL : https://stackoverflow.com/questions/699866/python-int-to-binary-string
'Programing' 카테고리의 다른 글
두 개의 dicts를 결합하는 파이썬적인 방법이 있습니까 (둘 다에 나타나는 키 값 추가)? (0) | 2020.02.16 |
---|---|
Bash 스크립트에서 OS를 감지하는 방법은 무엇입니까? (0) | 2020.02.16 |
고정 너비를 설정하는 방법은 무엇입니까? (0) | 2020.02.16 |
개인 바이트, 가상 바이트, 작업 세트 란 무엇입니까? (0) | 2020.02.16 |
gitgitore를 Git 저장소에 커밋해야합니까? (0) | 2020.02.16 |