1行のコードで、指定された整数が2i - 2jの形式であるかどうかを確認したいと思います。(ビット演算子を使用)
5 に答える
AndreyTが言うように、答えはHacker'sDelightにあります。
次の式を使用して、1ビットの右端の連続する文字列をオフにします(例:01011000⇒01000000)。
((x | (x – 1)) + 1) & x
これは、非負の整数が2 j –2kの形式であるかどうかを確認するために使用できます。j≥k≥0の場合。式を適用した後、結果の0テストを行います。
(宿題の質問なので、これを投稿するかどうかを議論していましたが、AndreyTがすでに述べており、簡単にグーグルできるので、直接引用する方が便利だと思います。質問者に、助けを受け入れることの倫理的影響に対処させます。宿題、そして彼の答えがこれに依存しているなら、彼はそれがどのように機能するかについての説明を自分で書くことを期待しています)
ヒントまたは2つ:
他の人は、あなたが探しているのは、1の文字列とそれに続く0の文字列で構成される数であると指摘しています。
この中のすべてのビットを反転すると、0の文字列の後に1の文字列が続きます。これをインクリメントすると、すべての1ビットがゼロになり、それらのちょうど1ビット上が1になります。
あなたとそれらの最後の2つを一緒にすると、ゼロになります。
2進数では、2の累乗は次の形式の数値です100...0
(Aの1
後にx
0
sが続きます。ここx
で、は指数です)
したがって、2 i -2 jの形式の2進数は、sの文字列の後に1
sの文字列が続き0
ます。
Windows Calculator(バイナリモード)は、これを試すのに最適な方法です。
これを少し見てみましょう。i = jの場合、答えは整数が0かどうかを確認することです。それ以外の場合、重要なのは、ビットがトグルする頻度を確認することです。見たいのは、すべての1がグループとしてまとめられているかどうかです。 、実際にはここでの計算は非常に単純です。トグルが2の場合、その形式になります。
0を取得するまで左シフトし、uがゼロを取得すると、uは再び1を取得しないようにする必要があります