首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ABAP进行位移位

使用ABAP进行位移位
EN

Stack Overflow用户
提问于 2011-12-02 07:33:02
回答 2查看 2.4K关注 0票数 2

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

有没有人知道用ABAP实现这种转换的另一种方法?是否有一种方法可以只使用NOT、AND、OR和XOR操作来获得与移位相同的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-02 18:16:50

编辑:更新后的代码现在可以在这里找到:github gist

票数 4
EN

Stack Overflow用户

发布于 2011-12-02 07:51:31

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

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

逻辑左移(LSHL)

可以用乘法来表示:

代码语言:javascript
复制
x LSHL n = x * 2^n

例如,给定x=9, n=2

代码语言:javascript
复制
9 LSHL 2 = 9 * 2^2 = 36

逻辑右移(LSHR)

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

代码语言:javascript
复制
x LSHR n = x / 2^n

给定x=9, n=2

代码语言:javascript
复制
9 LSHR 2 = 9 / 2^2 = 2.25 -> 2 (truncation)

算术左移(此处:“”)

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

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

代码语言:javascript
复制
x ASHL n = ((x AND (2^31-1)) * 2^n) + (x AND 2^31)

示例:在Java中将Integer.MAX_VALUE左移一位

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

代码语言:javascript
复制
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));

程序的输出:

代码语言:javascript
复制
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/)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8349886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档