2013-12-10 4 views
5

Sono nuovo di Python. In Perl, per impostare bit specifici su una variabile scalare (numero intero), posso usare vec() come di seguito.Equivalente di Python della funzione perl vec()

#!/usr/bin/perl -w 
$vec = ''; 
vec($vec, 3, 4) = 1; # bits 0 to 3 
vec($vec, 7, 4) = 10; # bits 4 to 7 
vec($vec, 11, 4) = 3; # bits 8 to 11 
vec($vec, 15, 4) = 15; # bits 12 to 15 

print("vec() Has a created a string of nybbles, 
in hex: ", unpack("h*", $vec), "\n"); 

uscita:

vec() Has a created a string of nybbles, 
     in hex: 0001000a0003000f 

mi chiedevo come realizzare la stessa in Python, senza dover scrivere il codice di manipolazione bit e utilizzando struct.pack manualmente?

+0

Quando si dice il codice di manipolazione po vuoi dire Bitshift << >>? – user2958652

+2

Si dice che imposta bit da 0 a 3, da 4 a 7, ecc. Ma imposta nibbles 3 (bit da 12 a 15), 7 (bit da 28 a 31), ecc. In ogni caso, dovrebbe essere facile scrivere il proprio 'vec 'se non c'è un equivalente. – ikegami

+2

Forse la domanda [Matrice di bit in Python] (http://stackoverflow.com/q/11669178/2157640) sarebbe d'aiuto. – Palec

risposta

0

Non sono sicuro di come la funzione vec funzioni in perla (non ha funzionato con la funzione vec). Tuttavia, in base all'output che hai menzionato, il seguente codice in python funziona correttamente. Non vedo il significato del secondo argomento. Per chiamare la funzione vec in questo modo: vec (valore, dimensione). Ogni volta che lo fai, la stringa di output sarà concatenata alla variabile globale final_str.


final_vec = '' 
def vec(value, size): 
    global final_vec 
    prefix = '' 
    str_hex = str(hex(value)).replace('0x','') 
    str_hex_size = len(str_hex) 
    for i in range (0, size - str_hex_size): 
     prefix = prefix + '0' 
    str_hex = prefix + str_hex 
    final_vec = final_vec + str_hex 
    return 0  
vec(1, 4) 
vec(10, 4) 
vec(3, 4) 
vec(15, 4) 
print(final_vec) 
0

Se davvero si vuole creare una stringa esadecimale da stuzzichini, si potrebbe risolvere in questo modo

nibbles = [1,10,3,15] 
hex = '0x' + "".join([ "%04x" % x for x in nibbles])