답변:
파이썬의 문자열 형식 메소드는 형식 스펙을 취할 수 있습니다.
>>> "{0:b}".format(37)
'100101'
str.format()
하나의 값을 형식화하는 것은 과잉입니다. format()
기능으로 바로 이동 하십시오 format(n, 'b')
. 자리 표시자를 구문 분석하고 인수와 일치시킬 필요가 없으며 값 형식화 작업 자체로 바로 이동하십시오. str.format()
서식이 지정된 결과를 더 긴 문자열로 배치해야하는 경우 에만 사용 하십시오 (예 : 템플리트로 사용).
0
서식 문자열에 선행으로 자리 수를 추가하십시오 format(10, '016b')
. 선행 0으로 16 자리로 형식화하십시오 .
0
in "{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" + s
and 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])
이 함수는 18446744073709551615
string으로 표시되는 만큼 양의 정수를 변환 할 수 있습니다 '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)
기대하는 것을 얻을 수 있습니까?