2011-03-02 93 views
0

我有一個C代碼,在此期間我打開一個文件來輸入一個十六進制數字。然後,我想將獲得的數字添加到另一個十六進制數字中,最後以十六進制顯示數字。例如我輸入AC65E1,然後添加E並顯示AC65EF。在C中操作十六進制碼

有沒有辦法做到這一點,而不經過轉換爲十進制並添加十進制,然後轉換回十六進制?如果沒有什麼是時間最佳的方式來做到這一點?

編輯:我想我的問題是我誤解了,我想知道我是否可以使用'+'與十六進制?如果我不能那麼我將不得不使用更改爲十進制來使用'+'運算符。對不起,任何錯誤輸入!

現在我正在將文件中的數據讀入char hex_num [10];

+0

試試這個:'printf(「%02x%02X%d \ n」,42,42,42);':) – pmg 2011-03-02 14:40:36

+1

即使在您編輯@Syntax_Error之後,您仍然對數字的處理方式有着根本性的誤解在電腦上。你所擁有的是一串字符 - 對人眼來說 - 是一個數字(它看起來像十六進制符號)。即使字符串看起來像十進制,情況也完全相同。您不能對字符串執行數字運算。您需要將字符串轉換爲其真正的數字類型(打印時可能看起來像是十進制或十六進制,但實際上是二進制的,並且_不要緊),以便對其進行算術運算。 – 2011-03-02 15:04:07

+0

可能的重複[如何在C中將十六進制數字轉換爲基數10?](http://stackoverflow.com/questions/10324/how-can-i-convert-a-hexadecimal-number-to-base -10-effective-in-c) – 2011-03-02 15:06:33

回答

2

數學在C和其他語言都沒有任何特定的基礎—做除了在處理的最低水平,其中,當然,它們發生在二進制。

我認爲你的問題已被破壞,因爲你想添加EAC65E1,並再次得到.. AC65E1。推測你的意思是AC65EF

我建議從文件中讀取數據,並將看起來像數字的字符串解析爲整數,然後執行算術運算,然後以任意表示形式再次輸出它們。

爲此,請使用strtol16作爲base參數或fscanf以首先讀入整數。

+0

或strtoul取決於輸入。 – 2011-03-02 15:01:09

+0

@dwelch:的確如此。 – 2011-03-02 15:02:11

3

實際上,計算機會以二進制形式完成所有工作,所以除非您想要做大量毫無意義的工作來強制它對原始十六進制數字進行算術運算,您需要解析數字,添加他們,並將結果以十六進制形式再次呈現出來。

unsigned int value1, value2; 
fscanf(fp, "%x %x", &value1, &value2) 

unsigned int result = value1 + value2; 
printf("%x\n", result); 
0

你似乎有點困惑。

如果你這樣做:

int a = 43, b = 12; 

printf("%d+%d=%d\n", a, b, a + b); 

電腦做任何 「十進制加入」。加法是用二進制完成的,它在編譯時爲文字轉換成十進制文本,在運行時用於打印輸出。

您應該簡單地使用strtol來解析數字或sscanf(),然後添加。

以任何方式手動編寫基於文本的例程以「以十六進制添加」不會更好。

1

你可以寫一個逐個字符的加法器,就像你在紙上自然要做的那樣,即比較最後一個數字'1'+'E'='F',沒有進位等等。

儘管如此,假設您的代碼以十六進制數進行解析是有效的(這比小數執行起來要容易得多)並且假設您的數字足夠小以適合機器寄存器或兩個 - 如果你有1000+數字的十六進制字符串,那麼逐個字符的方式可能是最簡單的。

在任何情況下,這些都是從文件中讀取:IO將比添加速度慢得多。所以我不會擔心添加的每一點性能。