MSBと残りのビットを16進文字列から分離する必要があります。たとえば、次のようにa2
なり1010 0010
ます。に相当する16進文字列があります。MSB(この場合は1)を分離し、残りの数値を10進数に変換したいと思います。私はこのようなことをすることができると思います:
$hex = 'a2';
$dec = hex($hex);
$bin = sprintf("%b", $dec);
$msb = substr $bin, 0, 1;
$rest = substr $bin 1, 7;
$restDec = oct("0b" . $rest);
ただし、ビット演算に文字列を使用するのは好きではありません。これを行うためのより良い方法はありますか?
ビット演算子の使用は簡単です。
$msb = ($dec & 128) >> 7
$rest = ($dec & 127)
説明:
10進数の128は0x80
または0b1000_0000
であるため、最上位ビットを除くすべての128マスク(ゼロに設定)でビット単位の「and」演算子を使用すると、LSBにシフトダウンして結果が0または1になります。実際にはディスペンスできます。マスキング操作を使用して右にシフトするだけですが、明示的にマスキングすることには2つの利点があります。
10進数の127は、0x7F
または0b0111_1111
ビット単位でこれを「and-ing」し$dec
、MSBをゼロに設定し、残りのビットはそのままにします。
追記:Perlには16進数のリテラル(0x...
)と2進数のリテラル(0b...
)があるため、上記も記述できます。
$msb = ($dec & 0x80) >> 7
$rest = ($dec & 0x7F)
あるいは
$msb = ($dec & 0b10000000) >> 7
$rest = ($dec & 0b01111111)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加