在我的腳本中,我正在處理二進制值,我需要在一個地方替換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類型的大小,但是你可以很容易地掩蓋掉高位 –