1

Perlには、のよう>>に機能するが最上位ビットを削除するビット演算子はありますか?演算子>>が関数に似ているようなものshift()で、私はのようなビット演算子を探していますpop()

110110戻るだろう10110

101戻るだろう01

最終的に、2進数形式の数値がパリンドローム(つまり、11011、111、または1010101)であるかどうかを確認しようとしているので、理想的には、オペレーターは削除したビットを返す方法があります。数学的にそうすることができたので、演算子がそうしなくても大丈夫ですが、クリーンなコードのために、MSBを自動的に返すと素晴らしいでしょう。LSBについては、

$LSB=$mynum-2*($mynum>>1);
$mynum>>=1;
4

4 に答える 4

2

整数の2進表現が回文であるかどうかを確認する方法を参照してください。

于 2010-12-22T05:28:19.423 に答える
2

文字列として保存するよりも簡単な方法は考えられません。

my $bits = sprintf '%b', $num;
while ( $bits =~ s/(.)// ) {
    print "removed $1\n";
}

それならあなたの回文チェックはただです

$bits eq reverse $bits
于 2010-12-22T05:29:22.270 に答える
1

値には可変数のビットがあるため、ビット文字列またはビットベクトルが必要です。CPANのBit::Vectorをチェックしてください-それはまだアクティブなようです。

しかし、他の人があなたの問題について示唆しているように、単純な古い文字列を処理する方がおそらく簡単です。

于 2010-12-22T05:45:39.517 に答える
0

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;

ハッカーの喜びの礼儀。

アセンブラで最上位ビットを見つけるには、MSVC _BitScanReverse、GCC_builtin_clzでBSRを使用できることに注意してください。しかし、私が知っている単純な高レベルの(そしてポータブルな)演算子はありません。言語は、CPUやコンパイラよりもはるかにゆっくりと進化します。

于 2010-12-22T05:32:32.347 に答える