2013-09-04 2 views
0

나는 이진수를 (1,3,6)와 같은 실제 이진수로 표현하는 목록을 0b100101으로 표현하려고합니다. 첫째, 2^1 + 2^3 + 2^(6)로 합계를 시도하고 내가 그래서 너무파이썬 : 바이너리를 합하는 방법? 바이너리 파워 벡터 프리젠 테이션에서 실제 바이너리 프리젠 테이션에 이르기까지, 어떻게?

>>> a=['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000'] 
>>> a[1]|a[2] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for |: 'str' and 'str' 
>>> bin(a[1])+bin(a[2]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'str' object cannot be interpreted as an index 

아래 a처럼 나열하는 변환 곳 이진

with open('DATA.txt') as f: 
    for line in f: 
      myLine=line.rstrip().split("\t") 
      print [bin(2**int(l)) for l in myLine[1:5]] 

로 변환

내가 어떻게 실제 진수 프레젠테이션에 전력 진수 프레젠테이션에서 얻을 수있는, 즉 이진수에 전원 벡터로 변환하는 방법 ?

간단한 예

입력

['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000'] 

의도 출력

0b100010000000000000100000000000 

답변

1

Bakuriu 아주 잘 무슨 일이 일어나고 있는지 설명, 그래서 나는이 짧은 만들 수 있습니다 : 당신이 reduce 기능을 사용할 수 있습니다 그 문자열을 결합 수. 문제에 대한 해결책은 그 요약 내가 여기 경우가 생각하는만큼 단지 다른 비트가 설정되어 바이너리 또는 동일

with open('DATA.txt') as f: 
    for line in f: 
     myLine=line.rstrip().split("\t") 
     print sum(2**int(l) for l in myLine[1:5]) 

주입니다.

+0

길이가 다른 이진수를 얻을 수 있습니까? 길이가 10 인 정수와 같이 모든 숫자를 얻을 수 있습니까? 예 : "0b000 0b1100 0b100100 0b11000"그래서 "0b00010 0b001100 0b100100 0b011000"앞에 여분의 0이 쌓여 있습니까? someStringBinary.zfill (30)은 거의 비슷하게 작동합니다. – hhh

+0

''0b '+ bin (20) [2 :] .zfill (10)' – Chronial

2

bin이 반환하는 값은 문자열 일뿐입니다. "이진수"가 아닙니다. 이진수는 존재하지 않으며 이진수는 이고 숫자는입니다. 파이썬 정수는 내부적으로 base-2로 표현되고, bin 함수는 이것을 문자열 (실제로는 모듈러스와 부호 표현이 아닌 2의 보수)으로 "볼"수 있습니다. 이진 문자열 목록 제공, 당신은을 얻기 위해 원하는 경우

In [7]: bin(int('0b10000', 2)|int('0b100', 2)) 
Out[7]: '0b10100' 

을 :

당신이 문자열의 뒤쪽으로 정수로 변환해야합니다 같은 그 문자열에 |로 비트 연산을 수행하려면

In [8]: import operator as op 

In [9]: from functools import reduce 

In [10]: a = ['0b10000000000000000000000000', '0b100000000000', '0b100000000000000000000000000000'] 

In [13]: bin(reduce(op.or_, (int(num, 2) for num in a))) 
Out[13]: '0b100010000000000000100000000000' 
관련 문제