我正在尝试将一些需要算术和逻辑位移位的Java代码移植到ABAP。据我所知,ABAP只支持按位NOT、AND、OR和XOR操作。
有人知道用ABAP实现这种转换的另一种方法吗?是否有一种方法可以通过使用NOT, AND, OR和XOR操作来获得与移位相同的结果?
免责声明:我不是特别熟悉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
向左移动1。逻辑左移可以表示为*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/)。
编辑:更新后的代码现在可以在这里找到:github gist