2016-02-16 141 views
1

你能否告訴我們是否有任何有效的方法來計算十六進制數字的總和而不將它們轉換爲base10?我知道如何手動計算總和(實際上與base10相同),但也許有更有效的方法?我將在ABAP中實現該算法,該算法能夠計算十六進制最大4字節長度的總和。十六進制和算法

+0

「的十六進制字符串和」沒有任何意義對我來說。你想做什麼? – vwegert

+0

對不起,只是想計算base16中的數字總和而不轉換爲base10 – user1500581

+0

你是什麼意思下的「有效的方式」?什麼是「無限HEX字符串」?字符串長度不確定? – Suncatcher

回答

0

聲明:我不知道ABAP,所以我可能在某些方面完全失效。

求和本質上是增加兩位數的複雜度和位數之間的折衷。在硬件層面,數字以二進制表示,因此每個digit addition都相當容易,但其中有很多。當進行任意大小(或大整數)算術運算時,通常避免在軟件中實現這些位級操作,而是將大量位組合成一個邏輯數位。如果將4位組合在一起,則最終會以十六進制添加。

但是,通過將多個十六進制數字組合成一個數字,您可以形成更大的數字。如果你的機器允許每個數字不超過4個字節,那麼我會得到這個數字的一​​半,即2個字節或每個數字16位。因此,您將四個十六進制數字組合在一起,然後將它們組合成一個數字(它將以10爲底數表示,但由於您只是用它進行計算,而不是打印它,因此它至少以我知道的語言在內部爲基數2)並執行這些的補充。添加兩個16位數的結果將有17位。其中,最不重要的16位表示結果的一個數字,而最重要的一位是下一位置的進位。將結果數字轉換回十六進制字符串時,請確保每個數字在將它們再次連接之前都將零填充爲4個十六進制數字。一些體系結構有一個進位標誌,所以它們可以將完整的寄存器寬度(在你的情況下是4個字節)作爲一個數字,並且仍然知道是否將進位加到下一個位置。但從高級語言訪問它往往是乏味的,這就是爲什麼我建議你使用寄存器寬度的一半。

請注意,數字分組,填充和連接會使代碼比單獨添加每個數字更復雜。您必須評估性能增益是否確實會增加複雜性。

-1

只需使用X型的變量,如下面的例子:

REPORT Y_HEX_SUM. 

PARAMETERS: p_h1(4) type c DEFAULT 'BAFF', 
      p_h2(4) type c DEFAULT '1234'. 

data: g_h1(2) type x, " This works in Unicode systems, otherwise make length 4. 
     g_h2(2) type x, 
     g_sum(2) type x. 

START-OF-SELECTION. 

    g_h1 = p_h1. 
    g_h2 = p_h2. 
    g_sum = g_h1 + g_h2. 
    write:/g_h1, '+', g_h2, '=', g_sum. 

,無需改變輸入參數,這將輸出:

BAFF + 1234 = CD33