Bit shifts with ABAP

风流意气都作罢 提交于 2020-01-04 14:17:37

问题


I'm trying to port some Java code, which requires arithmetic and logical bit shifts, to ABAP. As far as I know, ABAP only supports the bitwise NOT, AND, OR and XOR operations.

Does anyone know another way to implement these kind of shifts with ABAP? Is there perhaps a way to get the same result as the shifts, by using just the NOT, AND, OR and XOR operations?


回答1:


Disclaimer: I am not specifically familiar with ABAP, hence this answer is given on a more general level.

Assuming that what you said is true (ABAP doesn't support shifts, which I somewhat doubt), you can use multiplications and divisions instead.

Logical shift left (LSHL)

Can be expressed in terms of multiplication:

x LSHL n = x * 2^n

For example given x=9, n=2:

9 LSHL 2 = 9 * 2^2 = 36

Logical shift right (LSHR)

Can be expressed with (truncating) division:

x LSHR n = x / 2^n

Given x=9, n=2:

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

Arithmetic shift left (here: "ASHL")

If you wish to perform arithmetic shifts (=preserve sign), we need to further refine the expressions to preserve the sign bit.

Assuming we know that we are dealing with a 32-bit signed integer, where the highest bit is used to represent the sign:

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

Example: Shifting Integer.MAX_VALUE to left by one in Java

As an example of how this works, let us consider that we want to shift Java's Integer.MAX_VALUE to left by one. Logical shift left can be represented as *2. Consider the following program:

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));

The program's output:

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

The result is negative due that the highest bit in integer is used to represent sign. We get the exact number of -2, because of the way negative numbers are represents in Java (for details, see for instance http://www.javabeat.net/qna/30-negative-numbers-and-binary-representation-in/).




回答2:


Edit: the updated code can now be found over here: github gist



来源:https://stackoverflow.com/questions/8349886/bit-shifts-with-abap

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!