2016-11-27 2 views
0

Ich möchte ein int-Array mit konstanten Werten initialisieren, mit allen 2^n Werten von 2^0 bis 2^31 und ich möchte wissen, welche Methode unten richtig ist und ob es die Ergebnis, das ich will und wenn es leichtere oder kürzere Methoden gibt, es zu initialisieren.Ich deklariere mein int-Array in C

static const char  two_n[32]; 

two_n[32] = {1, 2 ,4 ,8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 
       8192, 16384, 32768, 65535, 131070, 262140, 524280, 1048560, 
       2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 
       268435456, 536870912, 1073741824, 2147483648}; 

oder

static const char  *two_n[32]; 

two_n[32] = {1, 2 ,4 ,8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 
       8192, 16384, 32768, 65535, 131070, 262140, 524280, 1048560, 
       2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 
       268435456, 536870912, 1073741824, 2147483648}; 

oder

static const int  two_n[32]; 

two_n[32] = {1, 2 ,4 ,8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 
       8192, 16384, 32768, 65535, 131070, 262140, 524280, 1048560, 
       2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 
       268435456, 536870912, 1073741824, 2147483648}; 
+3

Keine von diesen arbeiten. Hast du gerade den Code ausprobiert und die Ergebnisse gesehen? Sie müssen Ihr Verständnis von Arrays überprüfen. Versuchen Sie etwas einfacheres. –

+0

65535 ist falsch zusammen mit einigen mehr danach. Sie sollten besser das Array mit einer einfachen "for" -Schleife füllen, wenn das Programm startet. Oder Sie könnten die hexadezimale Notation für die Konstanten verwenden, da die hexadezimalen Werte einem schönen offensichtlichen Muster folgen. – user3386109

+0

Danke für die Kommentare, ich bin in einer Schule, wo die Verwendung der for-Schleifen im ersten Jahr verboten ist, und ich kann nicht hexadezimal verwenden, weil ich ein Programm machen muss, das Zahlen mit Radix sortiert, und ich konvertiere Zahlen zu binäre Basis dann Sortierung mit aufsteigender binärer Reihenfolge. –

Antwort

4

keiner der oben genannten, weil sowohl die Arten der Anordnungen und die initializers falsch sind. Verwenden uint32_t oder unsigned long da diese gewährleistet sind mindestens 32 Bit breit und in der Lage sein, den Wert von 2 31 zu halten, die über den Bereich von int sein könnten:

static const unsigned long two_n[32] = { 
    1UL << 0, 1UL << 1, 1UL << 2, 1UL << 3, 
    1UL << 4, 1UL << 5, 1UL << 6, 1UL << 7, 
    1UL << 8, 1UL << 9, 1UL << 10, 1UL << 11, 
    1UL << 12, 1UL << 13, 1UL << 14, 1UL << 15, 
    1UL << 16, 1UL << 17, 1UL << 18, 1UL << 19, 
    1UL << 20, 1UL << 21, 1UL << 22, 1UL << 23, 
    1UL << 24, 1UL << 25, 1UL << 26, 1UL << 27, 
    1UL << 28, 1UL << 29, 1UL << 30, 1UL << 31 
}; 
+0

Danke für den Kommentar, ich benutze langen Typ und nicht vorzeichenlos, da ich auch negative Werte brauche. –

+0

@MohammedBRAHMI: Wenn 'long' Typ 32 Bit breit ist, kann er nicht 2^31 halten. Sie würden 'long long' brauchen, das garantiert mindestens '2^63-1' hält – chqrlie

Verwandte Themen