Math 十六进制和算法
您能告诉我,是否有任何有效的方法来计算两个十六进制数的和,而不将它们转换成10进制数?我知道如何手动计算总和(实际上与base10相同),但也许有更有效的方法?我将在ABAP中实现该算法,该算法能够计算最大4字节长度的十六进制和。免责声明:我不知道ABAP,因此在某些方面可能完全不正确 求和本质上是两位数相加的复杂性和位数之间的折衷。在硬件层面上,数字是用二进制表示的,因此每个数字都相当简单,但有很多数字。当您执行任意大小(或大整数)算术时,通常避免在软件中实现这些位级操作,而是将大量位组合到一个逻辑数字中。如果将4位组合在一起,则以十六进制的长加法结束 但是,通过将多个十六进制数字组合成一个数字,可以形成更大的数字。如果您的机器允许每个数字不超过4字节,那么我将使用该数字的一半,即每位数2字节或16位。所以你把四组十六进制数字组合成一个数字(以10为基数表示,但因为你只是用它来计算,而不是打印,它在内部是以2为基数的,至少在我所知道的语言中是这样),然后对这些数字进行加法。两个16位数字相加的结果将为17位。其中,最低有效16位构成结果的数字,而最高有效16位是下一个位置的进位。将结果数字转换回十六进制字符串时,请确保在再次连接它们之前,将每个数字的零填充为4个十六进制数字 有些体系结构具有进位标志,因此它们可以将完整寄存器宽度(在您的情况下为4字节)作为一个位数,并且仍然知道是否将进位添加到下一个位置。但是从高级语言访问它往往是乏味的,这就是为什么我建议您使用寄存器宽度的一半Math 十六进制和算法,math,hex,byte,biginteger,abap,Math,Hex,Byte,Biginteger,Abap,您能告诉我,是否有任何有效的方法来计算两个十六进制数的和,而不将它们转换成10进制数?我知道如何手动计算总和(实际上与base10相同),但也许有更有效的方法?我将在ABAP中实现该算法,该算法能够计算最大4字节长度的十六进制和。免责声明:我不知道ABAP,因此在某些方面可能完全不正确 求和本质上是两位数相加的复杂性和位数之间的折衷。在硬件层面上,数字是用二进制表示的,因此每个数字都相当简单,但有很多数字。当您执行任意大小(或大整数)算术时,通常避免在软件中实现这些位级操作,而是将大量位组合到一
请注意,数字分组、填充和串联将使代码比单独添加每个数字要复杂得多。您必须评估性能增益是否确实保证了增加的复杂性。只需使用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”并不重要,除非您尝试添加字符串表示。