在我的脚本中,我正在处理二进制值,我需要在一个地方替换0-> 1和1-> 0。替换二进制形式0-> 1和1-> 0值 - perl
例如: 输入数字= 10101001 输出位数= 01010110
我试图$string =~ s/1/0/;
和reverse function
但越来越不给我纠正了放。
有人能帮我一把。
在我的脚本中,我正在处理二进制值,我需要在一个地方替换0-> 1和1-> 0。替换二进制形式0-> 1和1-> 0值 - perl
例如: 输入数字= 10101001 输出位数= 01010110
我试图$string =~ s/1/0/;
和reverse function
但越来越不给我纠正了放。
有人能帮我一把。
使用:
my $str = '10101001';
$s =~ tr/01/10/;
print "$s\n";
输出:
01010110
如果您输入字符串只有这两个可能性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
这是T代表语言,只有提供替代一个糟糕的选择,但Perl中也有一个原子的翻译功能:
$str =~ tr/01/10/;
将工作一样好(更好的,真的,因为它是更少的代码,也许不太越过数据)。
你也可以去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";
为什么不使用'my $ result =〜$ binval'? –
因为它也会“填充”任何未设置的位 - 例如在这个64位系统上,我现在在前面,它会返回1111111111111111111111111111111111111111111111111111111101010110' – zb226
我不知道Perl中int类型的大小,但是你可以很容易地掩盖掉高位 –