gpt4 book ai didi

Perl:将 MSB 和其余位与十六进制分开

转载 作者:行者123 更新时间:2023-12-01 00:11:24 31 4
gpt4 key购买 nike

我需要将十六进制字符串中的 MSB 和其余位分开。例如:我有一个十六进制字符串 a2,相当于 1010 0010。我想分离出 MSB(在本例中为 1),其余数字转换为十进制。我想我可以做这样的事情:

$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)

解释:

十进制 128 是 0x800b1000_0000,因此使用带 128 个掩码(设置为零)的按位“与”运算符,除了最高位,然后我们将其移位一直到 LSB,结果最终为 0 或 1。实际上,您可以省去屏蔽操作,只需右移即可,但显式屏蔽有两个优点:

  1. 它使意图非常清晰,并且
  2. 即使您无意中将其应用于大于 255 的数字,也能正常工作。

十进制 127 是 0x7F0b0111_1111 并使用 $dec 按位“与”将 MSB 设置为零,同时保留其余位。

附加说明:Perl 具有十六进制数字文字 (0x...) 二进制文字 (0b...),因此上面也可以写成

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

甚至

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

关于Perl:将 MSB 和其余位与十六进制分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45973482/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com