2015-07-28 64 views
4

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

例如: 输入数字= 10101001 输出位数= 01010110

我试图$string =~ s/1/0/;reverse function但越来越不给我纠正了放。

有人能帮我一把。

回答

10

使用​​:

my $str = '10101001'; 

$s =~ tr/01/10/; 

print "$s\n"; 

输出:

01010110 
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 

这是T代表语言,只有提供替代一个糟糕的选择,但Perl中也有一个原子的翻译功能:

$str =~ tr/01/10/; 

将工作一样好(更好的,真的,因为它是更少的代码,也许不太越过数据)。

2

你也可以去mathy就这个问题和使用按位异或操作^ ......

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"; 
+2

为什么不使用'my $ result =〜$ binval'? –

+0

因为它也会“填充”任何未设置的位 - 例如在这个64位系统上,我现在在前面,它会返回1111111111111111111111111111111111111111111111111111111101010110' – zb226

+0

我不知道Perl中int类型的大小,但是你可以很容易地掩盖掉高位 –

相关问题