位移与ABAP

时间:2011-12-01 23:33:02

标签: bit-manipulation sap abap

我正在尝试将一些需要算术和逻辑位移的Java代码移植到ABAP。 据我所知,ABAP仅支持按位NOT,AND,OR和XOR运算。

有没有人知道用ABAP实现这种转变的另一种方式?通过仅使用NOT,AND,OR和XOR运算,是否有可能获得与变换相同的结果?

2 个答案:

答案 0 :(得分:3)

免责声明:我对ABAP并不是特别熟悉,因此这个答案是在更一般的层面上给出的。

假设你所说的是真的(ABAP不支持轮班,我有点怀疑),你可以使用乘法和除法。

向左逻辑左移(LSHL)

可以用乘法表示:

x LSHL n = x * 2^n

例如给定x=9, n=2

9 LSHL 2 = 9 * 2^2 = 36

逻辑右移(LSHR)

可以用(截断)除法表示:

x LSHR n = x / 2^n

鉴于x=9, n=2

9 LSHR 2 = 9 / 2^2 = 2.25 -> 2 (truncation)

算术左移(此处:“ASHL”)

如果您希望执行算术移位(=保留符号),我们需要进一步细化表达式以保留符号位。

假设我们知道我们正在处理一个32位有符号整数,其中最高位用于表示符号:

x ASHL n = ((x AND (2^31-1)) * 2^n) + (x AND 2^31)

示例:在Java中将Integer.MAX_VALUE向左移动

作为一个如何工作的例子,让我们考虑一下我们想要将Java的Integer.MAX_VALUE向左移一个。左移逻辑可以表示为*2。请考虑以下程序:

int maxval = (int)(Integer.MAX_VALUE);
System.out.println("max value : 0" + Integer.toBinaryString(maxval));
System.out.println("sign bit  : " + Integer.toBinaryString(maxval+1));
System.out.println("max val<<1: " + Integer.toBinaryString(maxval<<1));
System.out.println("max val*2 : " + Integer.toBinaryString(maxval*2));

该程序的输出:

max value : 01111111111111111111111111111111 (2147483647)
sign bit  : 10000000000000000000000000000000 (-2147483648)
max val<<1: 11111111111111111111111111111110 (-2)
max val*2 : 11111111111111111111111111111110 (-2)

结果是否定的,因为整数中的最高位用于表示符号。我们得到-2的确切数字,因为Java中的负数表示方式(有关详细信息,请参阅http://www.javabeat.net/qna/30-negative-numbers-and-binary-representation-in/)。

答案 1 :(得分:3)

编辑:现在可以在此处找到更新的代码:github gist