在我的脚本中,我正在处理二进制值,我需要在一个地方替换0-> 1和1-> 0。
示例: 输入数字= 10101001 输出数字= 01010110
我尝试了$string =~ s/1/0/;
和reverse function
,但这样就没有给我正确的输出。
有人可以帮助我。
答案 0 :(得分:10)
答案 1 :(得分:5)
如果您的输入字符串只有0
和1
这两种可能性,那么您可以在多阶段方法中使用替换:
$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";