Perl-二进制数(补码)转十进制数和十六进制数
二进制补码转十进制
思路
先找符号位,符号位如果为0,则为正数,直接转即可;
符号位如果为1,则为负数,先将除符号位的其他位当作无符号数转,再将转的结果减去2^(bit_width-1)。例如,0b1101, 101作为无符号数为5,5-2^3=-3
代码
sub bin2dec{
$bin=$_[0];
$bit_width=$_[1];
$bin=~m/^[0-1]{1}/;
$sign_bit=$&; # 符号位
$other_bit=$'; # 其他位
if($sign_bit=='0'){ # 正数
$dec = oct("0b".$bin);
}
else{ # 负数
$dec = oct("0b".$other_bit)-2**($bit_width-1);
}
return $dec;
print("$dec\n");
}
十进制转十六进制
$hex = sprintf("%x",$dec);
$hex = substr($hex,-4,);