質問

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やコンパイラよりもはるかに遅く進化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top