3

길이가 100 제로와 1보다 큰 바이너리 문자열에 대해 비트 연산을 수행하려고합니다. 나는 내가 같은 것을 사용하여 그것들을 변환 할 수 있다는 것을 안다. 마지막에 L 문자와 함께 1267650600228229401496703205375L을 인쇄한다. 그런 다음 파이썬 비트 연산자를 사용하지만 정수로 변환하는 것은 좋지 않은 생각입니다. 이것을 할 수있는 다른 방법이 있습니까?큰 바이너리 문자열에 대한 파이썬 비트 연산

+2

왜 당신이 파이썬 정수에 비트 연산을 할 수있는 나쁜 아이디어라고 생각합니까 :

또한 python3에

문서 작업? –

+0

100 또는 1000 개의 0과 1을 정수로 변환하는 것이 좋은 생각입니까? bitwise 그것을 사용하여 내 문제가 아니라 변환하는 ... @MartijnPieters –

+0

Martijn Pieters가 말한 것, 큰 정수는 연결된 목록 (예 : openssl의'BN_ *')으로 유지됩니다. bignum 이상의 연산자로 그것을하거나 그것을 베고 그것을 반복 루핑 같은 일을 끝납니다. – grochmal

답변

2

난 당신이 있기 때문에 정수를 사용하는 아이디어를 좋아하지 않는다 같은데요 :


파이썬 3 버전 (bin()의 출력의 시작 부분에서 시작 0b을 제거 돌보는) 기본 데이터를 난독 화합니다. 게다가 부호가있는 정수와 엔디안의 미묘함은 말할 것도없고 '0'으로 시작하는 문자열로 작업하기가 어렵습니다 (정수로 변환 할 때 트림되기 때문에).

bitarray 모듈을 사용해보십시오. pip와 함께 설치할 수 있습니다 : pip install bitarray.

from bitarray import bitarray 
ba1 = bitarray('0' + '1'*100) 
ba2 = bitarray('1' + '0'*100) 

len(ba1) # 101 
len(ba2) # 101 
ba1[0] # False 
ba2[0] # True 

ba1 | ba2 # bitarray('1111111111.......) 

# get your string back 
ba1.to01() # "01111111......." 

효율성을 말할 수 없습니다. 그러나 적어도 당신이 일하는 것에 관해서는 분명히 느낍니다. https://pypi.python.org/pypi/bitarray/0.8.1

0

01의 문자열에 대해 비트 연산을 수행하지 마십시오. 보통 좋지 않고 느립니다. 문자열을 실제 숫자로 변환 한 다음 여러 비트를 한 번에 처리합니다. 아무 문제 없습니다 :

int('1'*128,2) & int('1'*128,2) 

는하지만 당신은 이미 0들과 1의 문자열이 있고 문자열의 부분에 비트 연산을 제어합니다. 다음과 같은 작업을 수행 할 수 있습니다 왼쪽에서 오른쪽으로

l = '1'*1024 
r = '1'*1024 
print map(lambda x: x[0] & x[1], [(int(l[i:i+64], 2), int(r[i:i+64], 2)) for i in range(0,1024,64)]) 

이 효과적으로, 작은 덩어리 (64 비트) 문자열을 통해 &을 사용합니다.

각 결과에 bin()을 호출하고 문자열이 필요한 경우 다시 연결할 수 있습니다.

l = '1'*1024 
r = '1'*1024 
print(list(map(lambda x: x[0] & x[1], [(int(l[i:i+64], 2), int(r[i:i+64], 2)) for i in range(0,1024,64)])))