次の行に沿って for ループを開始することを考えています。
for(int i = 0; i <= 20, i++){
if i = 1;
i --;
` そして、i = 0 の場合を考慮すると、問題が発生します。2 つの可能性のあるケース、つまり、print i = 0 または print i = 1 があります。これは、再帰的に定義されることがわかります。ビットは前の桁に基づいて定義されます。
私はあなたの質問を明確に理解していませんでしたが、「11、111、111などのブロックなしで、1から(1<<20)までのすべての整数」を取得したいと思っていると思います。
もしそうなら、これはコードです:
for(int m = 0x55555; m <= 0xAAAAA; m <<= 1) {
int x = m;
do {
printf("x=0x%05x\n", x);
} while(x = (x - 1) & m);
}
私がそれをよく理解していれば、連続した 1 を含まない 20 ビット パターンごとに生成する必要があります。たとえば、00000000000000000001
有効ですが、そうで00000000000000000011
はありません。
これは自然に再帰的な問題です。これは、各ノードが 1 または 0 のいずれかであるツリーのように考えることができます。1 のノードは 1 つの子 (ビット 0) しか持つことができず、0 のノードは 2 つの子を持つことができます。別の 0 になります。絵的には、次のように機能します。
深さが 20 に達するまで、ツリーはこのように拡大しCUTOFF
ます。将来変更する可能性があるため、この値を と呼びます。コードの背後にあるアイデアは、まさにツリーによって伝えられるアイデアです。
#include <stdio.h>
#define CUTOFF 20
char buffer[CUTOFF+1];
void print_bits(char next_bit, unsigned char count) {
buffer[count] = next_bit + '0';
if (count == CUTOFF-1) {
buffer[CUTOFF] = '\0';
printf("%s\n", buffer);
return;
}
print_bits(!next_bit, count+1);
if (next_bit == 0)
print_bits(next_bit, count+1);
}
の場合は複数回出力する必要があるため、ビット文字列を含むバッファーを保持しますnext_bit == 0
。バッファは、ルートから現在のノードまでのパスを知る方法であり、各ノードはその深さに対応する位置にのみ書き込むことができます (によって追跡されcount
ます)。
次の方法でパーティーを開始できます。
int main(void) {
print_bits(0, 0);
print_bits(1, 0);
return 0;
}
の値が非常に大きいCUTOFF
(255 より大きい) 場合は、count
からunsigned char
に変更することをお勧めしint
ます。
このコードは、定義上、00000000000000000000
有効なエントリであることに注意してください。常に少なくとも 1 が必要な場合は、このケースを無視する必要があります。strcmp()
再帰の基本ケースで使用してテストできますが、それは非効率的です。もう 1 つの考えられる方法は、書き込んだ数のカウンターを保持し、基本ケースでその値をテストすることです (または、フラグを使用して、少なくとも "1" が書き込まれたかどうかを示します)。