답변:
파이썬의 문자열 형식 메소드는 형식 스펙을 취할 수 있습니다.
>>> "{0:b}".format(37)
'100101'
str.format()하나의 값을 형식화하는 것은 과잉입니다. format()기능으로 바로 이동 하십시오 format(n, 'b'). 자리 표시자를 구문 분석하고 인수와 일치시킬 필요가 없으며 값 형식화 작업 자체로 바로 이동하십시오. str.format()서식이 지정된 결과를 더 긴 문자열로 배치해야하는 경우 에만 사용 하십시오 (예 : 템플리트로 사용).
0서식 문자열에 선행으로 자리 수를 추가하십시오 format(10, '016b'). 선행 0으로 16 자리로 형식화하십시오 .
0in "{0:b}"을 떨어 뜨릴 수 있습니까? 하나의 숫자 만 서식이 지정된 경우을 넣는 것이 맞 "{:b}"습니까?
"{:08b}".format(37)
str(bin(i))[2:](1000000ops의 경우 0.721s)보다 "{0:b}".format(i)(1000000ops의 경우 0.369 초)
str.format()어쨌든 잘못된 도구입니다 format(i, 'b'). 대신 사용하십시오. 패딩 및 정렬 옵션도 제공한다는 점을 고려하십시오. format(i, '016b')16 비트 0으로 채워진 이진수로 형식을 지정합니다. 같은 작업을하려면 전화 bin()를 추가 해야합니다 str.zfill(): bin(i)[2:].zfill(16)( 전화 할 필요가 없습니다 str()!). format()의 가독성과 유연성 (동적 형식화가 훨씬 어려워 짐 bin())은 훌륭한 절충점이며, 유지 관리 성을 위해 최적화해야 할 때까지 성능을 최적화하지 마십시오.
f"{37:b}".
파이썬은 실제로 않습니다 이미 이것에 대한 내장 무언가가, 같은 작업을 할 수있는 능력 '{0:b}'.format(42)당신을 위해 (문자열) 비트 패턴을 줄 것이다, 42또는를 101010.
보다 일반적인 철학을 위해 언어 나 라이브러리는 사용자에게 원하는 모든 것을 제공하지 않습니다 . 정확히 필요한 것을 제공하지 않는 환경에서 작업하는 경우 동일한 내용을 두 번 작성할 필요가 없도록 개발할 때 코드 스 니펫을 수집해야합니다. 예를 들어 의사 코드와 같은 :
define intToBinString, receiving intVal:
if intVal is equal to zero:
return "0"
set strVal to ""
while intVal is greater than zero:
if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
십진수 값을 기준으로 이진 문자열을 구성합니다. 가장 유사하지 않은 의사 코드의 일반적인 비트임을 명심하십시오.제안하는 반복으로 큰 차이를 만들지는 않지만 효율적인 방법 . 그것은 실제로 그것이 어떻게 수행 될 수 있는지에 대한 지침으로 의미됩니다.
일반적인 아이디어는 다음의 코드를 선호하는 순서대로 사용하는 것입니다.
s = "1" + sand s = "0" + s라인에 있습니다. 각각은 불필요한 s 사본을 만듭니다. 대신 문자열을 반환하기 직전에 문자열을 되돌려 야합니다.
'{0:b}'.format(42)느린 방법은 단순히 사용하는 실제 언어에 따라 O (n ^ 2) 일 수도 있고 아닐 수도있는 일반적인 방법의 예 일뿐입니다. 파이썬은 이상적인 의사 코드 언어이므로 파이썬처럼 보이므로 명확하게하기 위해 변경하겠습니다.
s = "1" + s때 O (N)가 아닌 꽤 난해한 언어 일 것 s입니다. 모든 문자열이 뒤로 저장된 언어이거나 각 문자가 연결된 목록의 노드 일 수 있습니다. 일반적인 언어의 경우 문자열은 기본적으로 문자 배열입니다. 이 경우 문자열 앞에 접두사가 필요하면 다른 문자보다 먼저 문자를 넣는 방법은 무엇입니까?
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)
format(integer, 'b'). bin()특히 생산을 목표로 디버깅 도구입니다 진 정수 리터럴 구문 파이썬 , format()생산의 특정 형식에 의미는.
bin()이것이 파이썬 이진 정수 리터럴 구문을 생성하기위한 디버깅 도구 라는 것을 어떻게 알 수 있습니까? 설명서에서 찾을 수 없습니다.
oct()하고 hex().
str.zfill()사용할 수 str.format()또는 format(): 동적 두 번째 인수 '{0:0{1}b}'.format(x, n)나 format(b, '0{}b'.format(n)).
zfill은 동적 두 번째 주장보다 읽기 쉽고 이해하기 쉽다고 생각 합니다.
참고로 :
def toBinary(n):
return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
이 함수는 18446744073709551615string으로 표시되는 만큼 양의 정수를 변환 할 수 있습니다 '1111111111111111111111111111111111111111111111111111111111111111'.
훨씬 더 큰 정수를 제공하도록 수정할 수 있지만 "{0:b}".format()또는 만큼 편리하지는 않습니다 bin().
람다가있는 원 라이너 :
>>> 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', 그러나 어떤 수의 선도적 인 0을 추가합니다.
대안 요약 :
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.
str.format()하나의 값을 형식화하는 것은 과잉입니다. format()기능으로 바로 이동 하십시오 format(n, 'b'). 자리 표시자를 구문 분석하고 인수와 일치시킬 필요가 없습니다.
위의 답변이 주로 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 입니다.
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)
부호있는 정수 (범위 -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'
비트 연산자를 사용하여 다른 알고리즘을 사용하는 또 다른 솔루션입니다.
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
당신은 그렇게 할 수 있습니다 :
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'
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')
이진수를 계산하려면 :
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
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")
이것은 내 대답입니다 그것은 잘 작동합니다 ..!
def binary(value) :
binary_value = ''
while value !=1 :
binary_value += str(value%2)
value = value//2
return '1'+binary_value[::-1]
0어떻게됩니까? 예를 들어 binary(0)기대하는 것을 얻을 수 있습니까?