RPGLE 中的位移位
Bit shifting in RPGLE
I 语言,例如 Java 或 C,我们必须使用位移操作数。示例:
myValue <<= 1
如何在 RPGLE 中完成同样的事情? (如果可能的话)
你不能。
AND , OR, XOR, yes...shift no.
您似乎认为您可以用另一种语言做的所有事情在 RPG 中也应该可以做。这不是……没关系。 ILE 的优点在于您可以轻松地创建一个 C 程序来执行位移并在需要时从 RPG 调用它。
你当然可以 multiply/divide by 2^n....相同的结果,也许编译器将它优化为位移。但是您必须使用无符号整数变量。
对于 <<,divide 乘以 2、4、8 等。对于 >>,乘以 2、4、8 等。
要从 n = 1、2、3 得到 2、4、8 等,请使用 %inth(2 ** n)。
对于 division,使用 %div 而不是 / 运算符,以避免获得小数位。
C:
n = 5;
i <<= n;
i >>= n;
RPG:
n = 5;
i *= %inth(2 ** n);
i = %div(i : %inth(2 ** n));
or
i = shift_left (i : n);
i = shift_right (i : n);
dcl-proc shift_left;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return value * %inth(2 ** shift);
end-proc;
dcl-proc shift_right;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return %div(value : %inth(2 ** shift));
end-proc;
RPG 一点儿也不啰嗦。它是为解决业务问题而创建的,而位移通常不是解决业务问题所需要的。然而,RPG IV 是一种 ILE 语言,可以与其他 ILE 语言很好地协同工作。如果您需要移位,您可以在 C 中创建一个执行移位的函数,并从您的 RPG 程序中调用它。
因此,如果您有一个名为 ishiftl
的 C 函数,它将一个整数左移:
int ishiftl(int i) {
return i << 1;
}
您需要像这样创建一个 RPG 原型:
dcl-proc ishiftl int(10) ExtProc('ishiftl');
i Int(10) value;
end-proc;
那么你可以这样称呼它:
dcl-s result Int(10);
dcl-s num Int(10);
result = ishiftl(num);
注意: C 是一种区分大小写的语言,您定义函数名称的大小写很重要。另一方面,RPG 不区分大小写,所有标识符都隐式转换为大写。所以 ExtProc('name') 需要在定义的情况下显式定义 C 函数的名称。此外,还有一些事情要记住。一种是 C 按值传递参数。如果您不是特别熟悉如何在 RPG 中制作 C 函数原型,Barbara Morris 写了一个秘籍 sheet 来帮助您。它位于 here.
I 语言,例如 Java 或 C,我们必须使用位移操作数。示例:
myValue <<= 1
如何在 RPGLE 中完成同样的事情? (如果可能的话)
你不能。
AND , OR, XOR, yes...shift no.
您似乎认为您可以用另一种语言做的所有事情在 RPG 中也应该可以做。这不是……没关系。 ILE 的优点在于您可以轻松地创建一个 C 程序来执行位移并在需要时从 RPG 调用它。
你当然可以 multiply/divide by 2^n....相同的结果,也许编译器将它优化为位移。但是您必须使用无符号整数变量。
对于 <<,divide 乘以 2、4、8 等。对于 >>,乘以 2、4、8 等。
要从 n = 1、2、3 得到 2、4、8 等,请使用 %inth(2 ** n)。
对于 division,使用 %div 而不是 / 运算符,以避免获得小数位。
C:
n = 5;
i <<= n;
i >>= n;
RPG:
n = 5;
i *= %inth(2 ** n);
i = %div(i : %inth(2 ** n));
or
i = shift_left (i : n);
i = shift_right (i : n);
dcl-proc shift_left;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return value * %inth(2 ** shift);
end-proc;
dcl-proc shift_right;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return %div(value : %inth(2 ** shift));
end-proc;
RPG 一点儿也不啰嗦。它是为解决业务问题而创建的,而位移通常不是解决业务问题所需要的。然而,RPG IV 是一种 ILE 语言,可以与其他 ILE 语言很好地协同工作。如果您需要移位,您可以在 C 中创建一个执行移位的函数,并从您的 RPG 程序中调用它。
因此,如果您有一个名为 ishiftl
的 C 函数,它将一个整数左移:
int ishiftl(int i) {
return i << 1;
}
您需要像这样创建一个 RPG 原型:
dcl-proc ishiftl int(10) ExtProc('ishiftl');
i Int(10) value;
end-proc;
那么你可以这样称呼它:
dcl-s result Int(10);
dcl-s num Int(10);
result = ishiftl(num);
注意: C 是一种区分大小写的语言,您定义函数名称的大小写很重要。另一方面,RPG 不区分大小写,所有标识符都隐式转换为大写。所以 ExtProc('name') 需要在定义的情况下显式定义 C 函数的名称。此外,还有一些事情要记住。一种是 C 按值传递参数。如果您不是特别熟悉如何在 RPG 中制作 C 函数原型,Barbara Morris 写了一个秘籍 sheet 来帮助您。它位于 here.