代码之家  ›  专栏  ›  技术社区  ›  Kamrul Khan

Perl:从十六进制中分离MSB和其余位

  •  3
  • Kamrul Khan  · 技术社区  · 8 年前

    我需要从十六进制字符串中分离MSB和其余位。例如:我有一个十六进制字符串 a2 1010 0010

    $hex = 'a2';
    $dec = hex($hex);
    $bin = sprintf("%b", $dec);
    $msb = substr $bin, 0, 1;
    $rest = substr $bin 1, 7;
    
    $restDec = oct("0b" . $rest);
    

    然而,我不喜欢使用字符串进行位操作。有更好的方法吗?

    1 回复  |  直到 8 年前
        1
  •  6
  •   Jim Garrison    8 年前

    使用位运算符非常简单:

    $msb  = ($dec & 128) >> 7
    $rest = ($dec & 127)
    

    说明:

    十进制128为 0x80 0b1000_0000

    1. 它使意图清晰明了,并且
    2. 即使您无意中将其应用于大于255的数字,也有效。

    0x7F 0b0111_1111 按位“and ing”这个 $dec 将MSB设置为零,同时保留其余位。

    附加说明:Perl具有十六进制数字文字( 0x... 二进制文字( 0b...

    $msb  = ($dec & 0x80) >> 7
    $rest = ($dec & 0x7F)
    

    甚至

    $msb  = ($dec & 0b10000000) >> 7
    $rest = ($dec & 0b01111111)