Math 十六进制和算法

Math 十六进制和算法,math,hex,byte,biginteger,abap,Math,Hex,Byte,Biginteger,Abap,您能告诉我,是否有任何有效的方法来计算两个十六进制数的和,而不将它们转换成10进制数?我知道如何手动计算总和(实际上与base10相同),但也许有更有效的方法?我将在ABAP中实现该算法,该算法能够计算最大4字节长度的十六进制和。免责声明:我不知道ABAP,因此在某些方面可能完全不正确 求和本质上是两位数相加的复杂性和位数之间的折衷。在硬件层面上,数字是用二进制表示的,因此每个数字都相当简单,但有很多数字。当您执行任意大小(或大整数)算术时,通常避免在软件中实现这些位级操作,而是将大量位组合到一

您能告诉我,是否有任何有效的方法来计算两个十六进制数的和,而不将它们转换成10进制数?我知道如何手动计算总和(实际上与base10相同),但也许有更有效的方法?我将在ABAP中实现该算法,该算法能够计算最大4字节长度的十六进制和。

免责声明:我不知道ABAP,因此在某些方面可能完全不正确

求和本质上是两位数相加的复杂性和位数之间的折衷。在硬件层面上,数字是用二进制表示的,因此每个数字都相当简单,但有很多数字。当您执行任意大小(或大整数)算术时,通常避免在软件中实现这些位级操作,而是将大量位组合到一个逻辑数字中。如果将4位组合在一起,则以十六进制的长加法结束

但是,通过将多个十六进制数字组合成一个数字,可以形成更大的数字。如果您的机器允许每个数字不超过4字节,那么我将使用该数字的一半,即每位数2字节或16位。所以你把四组十六进制数字组合成一个数字(以10为基数表示,但因为你只是用它来计算,而不是打印,它在内部是以2为基数的,至少在我所知道的语言中是这样),然后对这些数字进行加法。两个16位数字相加的结果将为17位。其中,最低有效16位构成结果的数字,而最高有效16位是下一个位置的进位。将结果数字转换回十六进制字符串时,请确保在再次连接它们之前,将每个数字的零填充为4个十六进制数字

有些体系结构具有进位标志,因此它们可以将完整寄存器宽度(在您的情况下为4字节)作为一个位数,并且仍然知道是否将进位添加到下一个位置。但是从高级语言访问它往往是乏味的,这就是为什么我建议您使用寄存器宽度的一半


请注意,数字分组、填充和串联将使代码比单独添加每个数字要复杂得多。您必须评估性能增益是否确实保证了增加的复杂性。

只需使用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

“十六进制字符串之和”对我来说没有任何意义。你想做什么?很抱歉,只想计算base16中的数字之和,而不转换为base10。求和总是一种度量,从来不是一个目标。你到底想达到什么目的?无论你想做什么,很可能你使用了错误的方法。到目前为止你有什么?我认为这里的混乱源于数字根本不是“基数xx”。数字的字符串表示形式可以是“base xx”或“base yy”,但不能是数字本身。添加两个数字总是相同的,“base”并不重要,除非您尝试添加字符串表示。