pythonでbit演算 ~bit演算を使用したエンディアン変換~

bit演算,python

pythonでbit演算を使う必要があったので、使い方を勉強してみました。

ただ使い方だけ書いても身につかなそうなので、bit演算を用いてエンディアン変換を実装します。

pythonのエンディアン変換についてはライブラリを使えば実施できますが、今回はbit演算の勉強ということで愚直に実装していきます。(大した処理じゃないですが)

実装

ソース

16bitと32bitの処理に分けて、各種型の確認とendian変換を実装しました。

# hex文字列を変換(16bit)
print("----------16bit----------")
us_str = "1234"
print("文字列:{}".format(us_str))
us_int = int("0x"+us_str,16)
print("int:{} {}".format(us_int,type(us_int)))
us_bin = bin(us_int)
print("bin:{} {}".format(us_bin,type(us_bin)))
us_hex = hex(us_int)
print("hex:{} {}".format(us_hex,type(us_hex)))

# 16bitのendian変換
def endian_convert_16bit(us_input_int):
    us_rtn_int = ((us_input_int & 0x00FF) << 8) + \
                 ((us_input_int & 0xFF00) >> 8)
    return us_rtn_int

print("endian変換(16bit):{}".format(hex(endian_convert_16bit(us_int))))

# hex文字列を変換(32bit)
print("\n----------32bit----------")
ul_str = "12345678"
print("文字列:{}".format(ul_str))
ul_int = int("0x"+ul_str,16)
print("int:{} {}".format(ul_int,type(ul_int)))
ul_bin = bin(ul_int)
print("bin:{} {}".format(ul_bin,type(ul_bin)))
ul_hex = hex(ul_int)
print("hex:{} {}".format(ul_hex,type(ul_hex)))

# 32bitのendian変換
def endian_convert_32bit(ul_input_int):
    ul_rtn_int = ((ul_input_int & 0x000000FF) << 24) + \
                 ((ul_input_int & 0x0000FF00) << 8) + \
                 ((ul_input_int & 0x00FF0000) >> 8) + \
                 ((ul_input_int & 0xFF000000) >> 24)
    return ul_rtn_int

print("endian変換(32bit):{}".format(hex(endian_convert_32bit(ul_int))))

出力結果

注意点として、bin()やhex()で型変換して出力される値はstr型となります。

ただし0b(2進数)や0x(16進数)をそのまま記載した場合、int型の表現を変えているだけなのでそのままand演算などの処理が可能。

----------16bit----------
文字列:1234
int:4660 <class 'int'>
bin:0b1001000110100 <class 'str'>
hex:0x1234 <class 'str'>
endian変換(16bit):0x3412

----------32bit----------
文字列:12345678
int:305419896 <class 'int'>
bin:0b10010001101000101011001111000 <class 'str'>
hex:0x12345678 <class 'str'>
endian変換(32bit):0x78563412

その他の演算子

OR演算(|)やXOR演算(^)、bit反転(~)もpythonとC言語で使い方は変わりません。