2015-07-28 143 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類型的大小,但是你可以很容易地掩蓋掉高位 –