2013-12-10 36 views
5

私はPythonが初めてです。 Perlでは、特定のビットをスカラー変数(整数)に設定するには、vec()を以下のように使用できます。Pythonの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"); 

出力:

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

私はビット操作コードを記述することや、手動でstruct.packを使用せずに、Pythonで同じことを達成するためにどのように思っていましたか?

+0

それを解決することができますが、ビット操作コードを言うときあなたは<< >をビットシフトを意味しますか>? – user2958652

+2

ビット0〜3、4〜7などを設定しますが、ニブル3(ビット12〜15)、7(ビット28〜31)などを設定します。どちらの方法でも、 '等価物がない場合 – ikegami

+2

[Bit array in Python](http://stackoverflow.com/q/11669178/2157640)の質問に役立つかもしれません。 – Palec

答えて

0

vec関数が真珠でどのように機能するかわかりません(vec関数では機能していません)。しかし、あなたが言及した出力によれば、pythonの次のコードは正常に動作します。私は第二の議論の意義を見ない。このようにvec関数を呼び出す:vec(value、size)。これを行うたびに、出力文字列がグローバルな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

あなたが本当にニブルから16進文字列を作成したい場合は、あなたがこのよう

nibbles = [1,10,3,15] 
hex = '0x' + "".join([ "%04x" % x for x in nibbles]) 
関連する問題