Сдвиги битов с ABAP - PullRequest
       14

Сдвиги битов с ABAP

2 голосов
/ 02 декабря 2011

Я пытаюсь перенести некоторый код Java, который требует арифметических и логических сдвигов битов, на ABAP. Насколько я знаю, ABAP поддерживает только побитовые операции NOT, AND, OR и XOR.

Кто-нибудь знает другой способ реализовать подобные изменения с помощью ABAP? Возможно, есть ли способ получить тот же результат, что и сдвиги, используя только операции NOT, AND, OR и XOR?

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

Редактировать: обновленный код теперь можно найти здесь: github gist

3 голосов
/ 02 декабря 2011

Отказ от ответственности: я не особенно знаком с 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)

Арифметический сдвиг влево (здесь: «АШЛ»)

Если вы хотите выполнить арифметические сдвиги (= сохранить знак), нам нужно дополнительно уточнить выражения, чтобы сохранить знаковый бит.

Предполагая, что мы знаем, что имеем дело с 32-разрядным целым числом со знаком, где для представления знака используется старший бит:

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

Пример: смещение Integer.MAX_VALUE влево в Java

В качестве примера того, как это работает, давайте рассмотрим, что мы хотим сместить Integer.MAX_VALUE Java влево на единицу. Логический сдвиг влево можно представить как *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/).

...