2016-11-30 3 views
-7

Ich verstehe, dass es eine Zahl aufnehmen und ein Zeichen zurückgeben wird. Ich verstehe, was jede Codezeile macht, aber ich kann nicht wirklich ausdrücken, was sie insgesamt sinnvoll macht. Irgendwelche Ideen?Was macht diese C-Funktion?

int function(uint64_t P1) { 
    uint64_t L1 = P1; 
    uint32_t L2 = 1; 

    while (L1 > 15) { 
     L2 = (uint64_t)L2 << 4; 
     L1 = L1 >> 4; 
    } 
    uint32_t L3 = 0; 

    while (L2 != 0) { 
     L1 = P1; 
     uint32_t L4 = 0; 

     L4 = L1 % L2; 
     uint64_t L5 = (uint64_t)L4; 
     sub_function(L1/L2); 
     L3++; 
     P1 = L5; 
     L2 = (uint64_t)L2 >> 4; 
    } 
    L1 = L3; 

    return L1; 
} 

void sub_function(uint64_t P1) { 
    if (P1 <= 9) { 
     printf("%c", P1 + 48); 
    } else { 
     printf("%c", P1 + 55); 
    } 
} 
+3

Es scheint Umwandlung von dezimal nach hexadezimal zu sein – AndyG

+0

Da "L2" nur 32 Bit ist, bin ich mir da nicht so sicher. – Gerhardh

+0

@Gerhardh: Ich kam zu meiner Schlussfolgerung empirisch. Ohne aussagekräftige Namen und Kommentare ist es schwierig, etwas anderes zu sagen. – AndyG

Antwort

1

Dieser Code akzeptiert einen Dezimalwert und gibt die hexadezimale Darstellung aus.

Try it out yourself

In C können wir die %x (%X) Formatspezifizierer Flag printf verwenden, es zu tun für uns:

printf("%X", 16); // 10 
printf("\n"); 
printf("%X", 42); // 2A 

Wenn Sie einen C++ Compiler verwenden, können wir stattdessen verwenden die std::hex Strom Manipulation Flagge auf iostream das gleiche Ergebnis zu erzielen:

std::cout << std::hex << 16 << std::endl; // 10 
std::cout << std::hex << 42 << std::endl; // 2a 
+0

Nicht ein Pedant sein, aber warum geben Sie dem OP eine Lösung/Alternative in C++? – KevinDTimm

+0

@KevinDTimm: Bei Fragen wie diesen ist der Fragesteller typischerweise neu genug, dass er sie nicht erkennt, wenn er einen C++ - Compiler verwendet, also nahm ich instinktiv genau das an. – AndyG

+0

Sie haben die Frage als 'c' markiert und ihr Compiler sollte keine Rolle spielen - Ihr Beispiel wird für einen' c' Programmierer oder in einer 'c' Klasse nicht von großem Nutzen sein. – KevinDTimm