2017-03-13 2 views
1

0b0011100、0b001111111、0b100000000はOKですが、0b00110010と0b001010はOKではありません。シーケンシャルでなければなりません)。ループを使わずに連続した値をチェックする方法

しかし、私はループなしでそれを行う必要がありますキャッチです。

私が唯一、次の演算機能を持って、ループを使用することはできませんいくつかのクレイジーなAPIを使用しています!

+、 - 、*、|、||、&、& &、〜、、 TZC、POPCNT、< <、>>ある

プラス、マイナス、MULT、ビット単位または、論理的または、ビット単位と、論理と、ビット単位ではない、論理的ではない、ゼロカウンタを末尾に(カウントLSBから最初の1までのゼロ)、ポップカウンタ(1の数を数えます)、シft-leftとshift-rightがあります。

すべての値は64ビット長です。

+0

、これはどのような "クレイジーAPI" とは?一見、これは宿題のように見えます。 – MrSmith42

+1

これまでに何を試しましたか?私たちとあなたの考えを共有してください。 – MrSmith42

+1

私は、質問者が解決しようとする努力の兆候を示さないので、この質問をトピックとして閉じようとしています。 – MrSmith42

答えて

1
!(n >> (POPCNT(n) + TZC(n))) 

あなたはものの数をカウントし、その量によってゼロとシフトを末尾の場合(だけにして、すべてのセットのビットがシフトによって消去されるため)のものが連続している場合、結果は0のみです。

a >> bは、a/2^bまたはa/(1 << b)と同じです。シフトなし

!(POPCNT(n + 0b1) - 1) || !(POPCNT(n + 0b10) - 1) || !(POPCNT(n + 0b100) - 1) || ... 
+0

あなたの同様の操作である '^'べき乗演算と '<<'左シフトと一緒に、右シフトは、許可された操作のリストにありません。 –

+1

私はそれがそこになければならない、あるいは解決策が醜いと思う。例えば。 3だけ右にシフトするのではなく、 '&0xFFFFFFFFFFFFFFF8'を実行して'! 'をドロップすることができます。 'if'があれば64回することができます。 – maraca

+1

SHLが実際にサポートされていることは申し訳ありません。 質問を編集しました... @maraca thxたくさん!! – pio

関連する問題