2016-11-30 137 views
-7

我知道它會帶上一個數字並返回一個字符。我明白每行代碼都在做什麼,但我無法用一種有意義的方式真正地表達它在做什麼。有任何想法嗎?這個C函數在做什麼?

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

它似乎是從十進制到十六進制的轉換 – AndyG

+0

鑑於'L2'只有32位,所以我不太確定。 – Gerhardh

+0

@Gerhardh:我憑經驗得出結論。沒有更多有意義的名字和評論,很難說出發生了什麼。 – AndyG

回答

1

該代碼接受一個十進制值並打印十六進制表示。

Try it out yourself

在C,我們可以使用%x%X)格式說明標誌printf來爲我們做:

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

如果您使用的是C++編譯器,我們可以改用iostream上的std::hex流操作標誌以達到相同的結果:

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

不是一個討厭的人,但爲什麼給OP一個解決方案/替代方案在C++? – KevinDTimm

+0

@KevinDTimm:有了這樣的問題,提問者通常是新的,他們無法識別他們何時使用C++編譯器,所以我本能地假設了這一點。 – AndyG

+0

他們將問題標記爲'c',它們的編譯器無關緊要 - 您的示例對'c'程序員或'c'類沒有多大用處。 – KevinDTimm