2011-06-08 17 views
6

Bu şaşırtıcı olmayan, başarısız: ASCII abc011000010110001001100011 veya 6382179 eşit olma ilePython'da bir dizede bit işlemleri yapmak mümkün mü?

>>> 'abc' << 8 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for <<: 'str' and 'int' 
>>> 

, o keyfi bir miktar kaydırmak için bir yol öylesine 'abc' << 801100001011000100110001100000000 olurdu var mı?

Ya diğer bitsel işlemler hakkında? 'abc' & 63 = 100011 vb.

+0

Bakım açıklanır? Belki bir alternatif bulabiliriz. – Nix

+0

Evet ... Gerçekten bir kullanım durumunda göremiyorum ... bu bir numara saklamak ve daha sonra çıkış olmak gerektiğinde bir dize haline dönüştürmek, ancak daha iyi olurdu bile hala .... – cwallenpoole

+0

curosity gerçekten; yararlı olabileceği bir şey ortaya çıktı. Asla bitmek zorunda kalmadı, sadece düşünmeye başladım. – tMC

cevap

7

Ne muhtemelen istediğiniz Bit dizisi modülü (http://code.google.com/p/python-bitstring/ bakınız). Bitsel işlemlerin yanı sıra bir dizi diğer bit dizisini de destekliyor gibi görünüyor. Ancak, karakterleri değil, karakterleri içermeyen baytları (ör. b'abc' veya bytes('abc')) beslemeye dikkat etmelisiniz. Karakterler Unicode içerebilir ve birden fazla baytı kaplayabilir.

7

Bu dizeleri üzerinde ikilik işlemleri yapmak için herhangi bir anlam ifade etmez.

>>> import struct 
>>> x = 'abc' 
>>> x = '\x00' * (4-len(x)) + x 
>>> number = struct.unpack('!i', x)[0] 
>>> number 
6382179 

Ardından number tüm işlemleri yapabilirsiniz: Muhtemelen sayılara Dizelerinizi dönüştürmek için struct modülünü kullanmak istiyorum. (If) bir dizge geri istediğinde, struct.pack('!i', number) yapabilirsiniz.

+2

Mantıklı değil mi? Çok genel olmayın; Bir QR kodunda RS kodlamasını hazırlamak için bir dizeyi 4 ile bit kaydırmak istersem ne olur? –

+0

Dizelerdeki bitsel işlemleri bilmiyorum ama yapı benim için harika çalıştı. İşte kullanım vakası. Bazı oyunları kaydetmek için SGF dosya formatı var. Go durumunda, 19x19 bir tahtada oynanır, SGF dosyasındaki koordinatlar küçük harfli alfabetik karakterlerde verilir. Onları standart, sayısal x-y koordinatlarına dönüştürmem gerekiyor ve bu cevap bunun için mükemmel çalışıyor. Teşekkürler! – cb4

1

ben int ASCII dönüştürmek için bir kaç fonksiyonları yazmış ve geri sadece yerleşikleri ile. MSB/LSB'yi karıştırmış olabilirim, bu yüzden giriş dizelerini tersine çevirmek için [::-1] kullanıyorum. Siparişi beğenmezseniz kolay düzeltme.

Enjoy: Bu neden istediğini

>>> intstr = lambda z : ''.join([str(unichr((z & (255*(256**i)))/(256**i))) for i in range(0,((len(bin(z)) - 2)/8) + (1 if ((len(bin(z)) - 2)/8) else 0))]) 
>>> strint = lambda z : reduce(lambda x,y: x | y, [ord(str(z)[i])*((2**8)**i) for i in range(len(str(z)))]) 
>>> strint('abc'[::-1]) 
6382179 
>>> bin(strint('abc'[::-1]) & 63) 
'0b100011' 
>>> bin(strint('abc'[::-1]) << 8) 
'0b1100001011000100110001100000000' 
İlgili konular