次の基準を満たしているかどうかを確認する必要があります。
- バイナリでは、すべての1ビットが連続している必要があります。
- 番号には少なくとも1つのビットが設定されている必要があります。
- 連続する1ビットはMSBで開始するか、LSBで終了する可能性があるため、数値が単一の1ビットストリームとそれに続くゼロビットストリームで構成されている場合、またはその逆の場合は完全に有効です。
実際の問題についてこれらの条件をチェックする(データファイルの整合性をチェックする)コードを作成しました。
それは問題なく動作し、タイムクリティカルではありませんが、私は古いビットをいじくり回すフリークであり、そのようなパズルが大好きなので、シングル1ビットストリームをチェックするためのより賢い方法を考え出しました。
文字列がゼロで囲まれている場合は簡単ですが、特殊な場合には対応できません。
どんなアイデア、バイナリハック、部分的な解決策も大歓迎です!
要件をより明確にするために、いくつかの例を示します。次の数値は私の基準を満たしています。
0x80000000
0x00000001
0xff000000
0x000000ff
0xffffffff
0x000ff000
次の数字はそうではありません(複数の連続した文字列があるため):
0xf00000f <- one-bit streams should not wrap-around at 2^n
0x0001700 <- a trivial example.
0x0000000 <- no one bit at all.