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,); 
posted @ 2020-08-20 14:36  笑着刻印在那一张泛黄  阅读(1220)  评论(0编辑  收藏  举报