PERLのPOP機能に相当するビット操作(MSBを削除)
-
12-10-2019 - |
質問
Perlでは、ように振る舞うビットワイズオペレーターはありますか >>
, 、しかし、最も重要なビットを削除しますか?どのように似ています >>
オペレーターはやや似ています shift()
機能、私はちょっとしたオペレーターを探しています pop()
.
110110
戻ってきます 10110
101
戻ってきます 01
最終的に、バイナリ形式の数値がパリンドロームであるかどうかを確認しようとしています(つまり、11011、111、または1010101)。理想的には、オペレーターには削除されるビットを返す方法があります。私が数学的にできるように、オペレーターがそうでない場合は大丈夫ですが、Clean Codeのために、MSBを自動的に返した場合は素晴らしいでしょう。 LSBのために、私はします
$LSB=$mynum-2*($mynum>>1);
$mynum>>=1;
解決
文字列として保存するよりも簡単な方法を考えることはできません。
my $bits = sprintf '%b', $num;
while ( $bits =~ s/(.)// ) {
print "removed $1\n";
}
しかし、あなたのパリンドロームチェックは公正です
$bits eq reverse $bits
他のヒント
値にはさまざまな数のビットがあるため、少し文字列またはビットベクトルが必要です。チェックアウト ビット:: Vector CPANでは、まだアクティブであるようです。
しかし、他の人があなたの問題を示唆しているように、おそらくあなたが単純な古い文字列に対処する方が簡単だと思うでしょう。
私はPerlについては知りませんが、C/C ++ではあなたはそうするでしょう:
unsigned flp2(unsigned x) {
x = x | (x >> 1);
x = x | (x >> 2);
x = x | (x >> 4);
x = x | (x >> 8);
x = x | (x >>16);
return x - (x >> 1);
}
unsigned most_significant_bit = flp2(my_number);
my_number &= most_significant_bit;
ハッカーの喜びの厚意により。
アセンブラーで最も重要なビットを見つけるには、gcc _builtin_clzでMSVC _bitscanReverseでBSRを使用できることに注意してください。ただし、私が知っている単純な高レベル(およびポータブル)オペレーターはありません。言語は、CPUやコンパイラよりもはるかに遅く進化します。