替换二进制形式0-> 1和1-> 0值 - perl

时间:2015-07-28 07:21:58

标签: perl

在我的脚本中,我正在处理二进制值,我需要在一个地方替换0-> 1和1-> 0。

示例: 输入数字= 10101001 输出数字= 01010110

我尝试了$string =~ s/1/0/;reverse function,但这样就没有给我正确的输出。

有人可以帮助我。

3 个答案:

答案 0 :(得分:10)

使用tr

my $str = '10101001';

$s =~ tr/01/10/;

print "$s\n";

输出:

01010110

答案 1 :(得分:5)

如果您的输入字符串只有01这两种可能性,那么您可以在多阶段方法中使用替换:

$str =~ s/1/x/g;  # all 1's to x
$str =~ s/0/1/g;  # all 0's to 1
$str =~ s/x/0/g;  # all x's to 0

对于仅提供替换的语言来说,这不是一个糟糕的选择,但Perl也有一个原子翻译功能:

$str =~ tr/01/10/;

也可以正常工作(更好,真的,因为它的代码更少,可能更少的数据传递)。

答案 2 :(得分:2)

您也可以对此进行处理并使用按位XOR运算符^ ...

my $input  = '10101001';
my $binval = oct( '0b'.$input );
my $result = $binval ^ 0b11111111;
printf "%08b\n", $result;

...这也会给你01010110

这当然具有依赖于位输入字符串长度的缺点。给定的解决方案仅适用于8位值。但是,对于任意数量的比特来说,概括起来并不困难。

要合并Lưu Vĩnh Phúc的评论,您还可以使用按位NOT运算符~。同样,实现取决于您需要截断结果的位数:

my $input  = '10101001';
my $binval = oct( '0b'.$input );
print substr( sprintf ( '%b', ~$binval ), -8 )."\n";