이진으로 변환하고 파이썬에서 선행 0을 유지하십시오.


154

파이썬에서 bin () 함수를 사용하여 정수를 이진으로 변환하려고합니다. 그러나 항상 앞에 오는 0을 제거하여 결과는 항상 8 비트가되도록합니다.

예:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

이 방법이 있습니까?


참조 : 파이썬은 바이너리 int로? 특히 n-bit 표현에 대한 대답 입니다. 정확히 동일하지는 않지만이 질문에 답을 찾아 왔습니다.
Martin Thoma

답변:


220

format()기능을 사용하십시오 :

>>> format(14, '#010b')
'0b00001110'

format()기능은 단순히 Format Specification 미니 언어에 따라 입력을 포맷합니다 . 은 #형식이 포함하게 0b프리픽스 및 010크기는 10 개 문자와 폭에 맞도록 출력 포맷 0패딩; 0b접두어 는 2 자 , 이진수는 8 자입니다.

가장 컴팩트하고 직접적인 옵션입니다.

결과를 더 큰 문자열에 넣으려면 서식이 지정된 문자열 리터럴 (3.6+)을 사용하거나 자리 표시 자의 콜론 뒤에 함수 str.format()의 두 번째 인수를 사용하십시오 .format(){:..}

>>> value = 14
>>> f'The produced output, in binary, is: {value:#010b}'
'The produced output, in binary, is: 0b00001110'
>>> 'The produced output, in binary, is: {:#010b}'.format(value)
'The produced output, in binary, is: 0b00001110'

마찬가지로 단일 값의 서식을 지정하더라도 (더 큰 문자열로 결과를 넣지 않아도) 서식이 지정된 문자열 리터럴을 사용하는 것이 다음을 사용하는 것보다 빠릅니다 format().

>>> import timeit
>>> timeit.timeit("f_(v, '#010b')", "v = 14; f_ = format")  # use a local for performance
0.40298633499332936
>>> timeit.timeit("f'{v:#010b}'", "v = 14")
0.2850222919951193

그러나 format(...)의도를 더 잘 전달하기 위해 타이트한 루프의 성능이 중요한 경우에만 사용합니다 .

0b접두사 를 원하지 않으면 간단히 #필드를 삭제하고 필드 길이를 조정하십시오.

>>> format(14, '08b')
'00001110'

3
정확히 내가 찾던 것,이 형식은 나에게 정말 도움이됩니다. 나는 비트 조작을 배우기 시작했고 파이썬에서 숫자의 비트 형식을 찾기 위해 인터넷 검색을하고있었습니다. 이것을 찾았습니다. 감사합니다.
kratostoical

잘 작동합니다. 그래도 약간 부피가 커질 수 있습니다. format(192,'08b')+'.'+format(0,'08b')+'.'+format(2,'08b')+'.'+format(33,'08b') 11000000.00000000.00000010.00100001
목소리

@ tjt263 : 그렇기 때문에 결과를 더 큰 문자열에 넣을 경우 서식이 지정된 문자열 리터럴 (3.6+)을 사용하거나 str.format()자리 표시 자의 콜론 뒤에 format () 함수의 두 번째 인수를 사용하십시오 {:..}.
Martijn Pieters

1
@ tjt263 : 예를 들어 사용하십시오 f"{192:08b}.{0:08b}.{2:08b}.{33:08b}".
Martijn Pieters

아주 좋아요 나는 그것이 당신이 설명만으로 무엇을 의미하는지 알지 못했을 것입니다. 그러나 이제 나는 당신의 모범을 보았을 것입니다. 건배.
목소리

115
>>> '{:08b}'.format(1)
'00000001'

참조 : 형식 사양 미니 언어


참고 파이썬 2.6 또는 그 이상을 위해, 당신은 전에 위치 인수 식별자를 생략 할 수 :사용하므로,

>>> '{0:08b}'.format(1)
'00000001'      

3
필요할 str.format()때 여기 에서 사용할 필요는 없습니다 format(). 0b접두사 가 없습니다 .
Martijn Pieters

2
@MartijnPieters 는 한 번에 여러 변수를 수행 할 수 있기 때문에 str.format보다 유연 format()합니다. 나는 그 format기능이 존재 한다는 것을 잊어 버린다 . 이 경우에는 완벽하게 적합합니다.
Mark Ransom

1
@MarkRansom : 정확히 str.format()하나의 {}요소 만 사용 하고 다른 텍스트는 사용 하지 않고 문자열 템플릿을 사용 하지 않으면 하나의 값을 형식화하는 것입니다 . 이 경우을 사용하십시오 format(). :-)
Martijn Pieters

30

나는 사용하고있다

bin(1)[2:].zfill(8)

인쇄합니다

'00000001'

9

문자열 형식 미니 언어를 사용할 수 있습니다.

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])

데모:

print binary(1)

산출:

'0b00000001'

편집 : @Martijn Pieters 아이디어를 기반으로

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))

2
동일한 서식 언어를 사용하여 접두사를 포함시킬 수 있습니다. 사용하십시오 #. 또한 format()전체 문자열 템플릿을 수행 할 필요가 없습니다.
Martijn Pieters

2

파이썬을 사용하는 경우 >= 3.6, 가장 깨끗한 방법은 사용하는 F-문자열문자열 서식 :

>>> var = 23
>>> f"{var:#010b}"
'0b00010111'

설명:

  • var 형식화 할 변수
  • : 이 이후의 모든 것은 형식 지정자입니다.
  • #대체 형식을 사용하십시오 ( 0b접두사 추가 )
  • 0 제로 패드
  • 1010에서 오프까지의 총 길이 (에 대한 2 개의 문자 포함 0b)
  • b 숫자에 이진 표현을 사용

아니요, 단일 자리 표시 자보다 문자열을 더 많이 사용하지 않으면 깨끗 하지 않습니다 . 그렇지 않으면 format(var, "#010b")통신 의도 훨씬 더. 그러나 가장 빠른 옵션입니다. 그러나 당신은 이미 알고 있습니다. 왜냐하면 당신 이 내 답변에 게시 한 모든 것을 이미 다루었 기 때문 입니다.
Martijn Pieters

1

때로는 간단한 라이너 하나를 원할 수도 있습니다.

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

파이썬 3


1
[ ]필요하지 않아야 함에 유의하십시오 join(). 제너레이터 표현식을 승인합니다. ''.join('{0:08b}'.format(ord(x)) for x in input)
Christoph Burschka

@ChristophBurschka str.join()는 두 번의 패스가 필요하기 때문에 생성기 입력은 먼저 결합하기 전에 목록으로 변환됩니다. 이것은 성능에 약간의 영향을 미치며 생성기 표현식이 아닌 목록 이해를 전달하는 것이 실제로 더 좋습니다 . 규칙에 예외가있는 경우 하나입니다.
Martijn Pieters

-1

이런 식으로 사용할 수 있습니다

("{:0%db}"%length).format(num)

2
코드 스 니펫에는 최소한 코드 블록을 사용하십시오. 그리고 이것이 좋은 답변이되기를 원한다면이 솔루션이 왜 OP 질문을 해결하는지에 대한 의견을 추가하십시오.
β.εηοιτ.βε

가변 너비를 추가하기 위해 다른 문자열 서식 스타일을 사용할 필요는 없습니다. 다른 자리 표시자를 추가하십시오."{:0{l}b}".format(num, l=length)
Martijn Pieters

-1

파이썬 구문의 rjust string 메소드를 사용할 수 있습니다 : string.rjust (length, fillchar) fillchar는 선택 사항입니다

당신의 질문에 대해 당신은 이런 식으로 쓸 수 있습니다.

'0b'+ '1'.rjust(8,'0)

따라서 '0b00000001'이어야합니다.


구문 오류가 있습니다. 그러나 더 중요한 것은 질문에 전혀 답하지 않습니다 int.이를 텍스트 이진 표현으로 변환하는 것입니다. 로 시작하지도 않습니다 int.
Thierry Lathuille

-3

zfill을 사용할 수 있습니다 :

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2)

인쇄물:

01
10
100

숫자를 출력 할 때뿐만 아니라 변수에 할당해야 할 때 도움이 되므로이 솔루션이 마음에 듭니다 ... 예 : x = str (datetime.date.today (). month) .zfill (2) 2 월에 x를 '02'로 반환합니다.


1
zfill에 문제는 문자열처럼 이진 문자열을 취급하고 진 'B'표시하기 전에 0을 추가합니다 ... 예입니다 bin(14) 제공 ''0b1110 ''와 bin(14).zfill(8) 원하는 무슨이다 ''000b1110 '`하지`0b00001110'`하는 제공
Shaun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.