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.