Ibm midrange RPGLE中的位移位

Ibm midrange RPGLE中的位移位,ibm-midrange,bit-shift,rpgle,Ibm Midrange,Bit Shift,Rpgle,在Java或C等语言中,我们使用了位移位操作数。例如: myValue <<= 1 myValue你不能 还有,或者,XOR,是的……轮班号 你似乎认为用另一种语言所能做的一切都应该在RPG中可行。不是…没关系。ILE的好处在于,您可以轻松创建一个C过程,该过程可以进行位移位,并在需要时从RPG调用它 当然,您可以用2^n乘/除…相同的结果,也许编译器会将其优化为位移位。但您必须使用无符号整数变量。您不能 还有,或者,XOR,是的……轮班号 你似乎认为用另一种语言所能做的一切都应该

在Java或C等语言中,我们使用了位移位操作数。例如:

myValue <<= 1
myValue你不能

还有,或者,XOR,是的……轮班号

你似乎认为用另一种语言所能做的一切都应该在RPG中可行。不是…没关系。ILE的好处在于,您可以轻松创建一个C过程,该过程可以进行位移位,并在需要时从RPG调用它

当然,您可以用2^n乘/除…相同的结果,也许编译器会将其优化为位移位。但您必须使用无符号整数变量。

您不能

还有,或者,XOR,是的……轮班号

你似乎认为用另一种语言所能做的一切都应该在RPG中可行。不是…没关系。ILE的好处在于,您可以轻松创建一个C过程,该过程可以进行位移位,并在需要时从RPG调用它

当然,您可以用2^n乘/除…相同的结果,也许编译器会将其优化为位移位。但是您必须使用无符号整数变量。

对于,乘以2、4、8等

要从n=1、2、3获得2、4、8等,请使用%inth(2**n)

对于除法,请使用%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;                                        
C:
n=5;
i=n;
角色扮演:
n=5;
i*=%inth(2**n);
i=%div(i:%inth(2**n));
或
i=左移(i:n);
i=向右移位(i:n);
dcl程序左移;
dcl pi*n int(20);
值int(20)值;
移位int(20)值;
末端pi;
返回值*%inth(2**shift);
结束进程;
dcl程序右移;
dcl pi*n int(20);
值int(20)值;
移位int(20)值;
末端pi;
返回%div(值:%inth(2**shift));
结束进程;
用于,乘以2、4、8等

要从n=1、2、3获得2、4、8等,请使用%inth(2**n)

对于除法,请使用%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;                                        
C:
n=5;
i=n;
角色扮演:
n=5;
i*=%inth(2**n);
i=%div(i:%inth(2**n));
或
i=左移(i:n);
i=向右移位(i:n);
dcl程序左移;
dcl pi*n int(20);
值int(20)值;
移位int(20)值;
末端pi;
返回值*%inth(2**shift);
结束进程;
dcl程序右移;
dcl pi*n int(20);
值int(20)值;
移位int(20)值;
末端pi;
返回%div(值:%inth(2**shift));
结束进程;

RPG不是一种有点无聊的语言。它是为了解决业务问题而创建的,而位转移通常不是解决业务问题所需要的。然而,RPG IV是一种与其他ILE语言配合良好的ILE语言。如果需要移位,可以在C中创建一个执行移位的函数,并从RPG程序调用它

因此,如果您有一个名为
ishiftl
的C函数,它将整数左移:

int ishiftl(int i) {
    return i << 1;
}
然后你可以这样称呼它:

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不区分大小写,所有标识符都隐式转换为大写。因此,在定义C函数的情况下,需要ExtProc('name')来显式定义它的名称。此外,还有一些事情需要记住。一种是C通过值传递参数。如果您不太熟悉如何在RPG中创建C函数原型,Barbara Morris编写了一份备忘单来帮助您。RPG不是一种有点无聊的语言。它是为了解决业务问题而创建的,而位转移通常不是解决业务问题所需要的。然而,RPG IV是一种与其他ILE语言配合良好的ILE语言。如果需要移位,可以在C中创建一个执行移位的函数,并从RPG程序调用它

因此,如果您有一个名为
ishiftl
的C函数,它将整数左移:

int ishiftl(int i) {
    return i << 1;
}
然后你可以这样称呼它:

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不区分大小写,所有标识符都隐式转换为大写。因此,在定义C函数的情况下,需要ExtProc('name')来显式定义它的名称。此外,还有一些事情需要记住。一种是C通过值传递参数。如果您不太熟悉如何在RPG中创建C函数原型,Barbara Morris编写了一份备忘单来帮助您。它位于。

你击败了我的更新:)编译器是否将这样的操作优化为位移位?@Charles我正在研究位移位的性能,但我认为这不是最优的。我的意思是,它是位移位的更高层次的“抽象”。RPG编译器不会优化到位移位。我不知道优化翻译器是否做到了这一点。@LppEdd,你是对的,如果性能是目标,那么在RPG中,只做乘法或除法是最好的。如果出于某种原因我真的对移位n位感兴趣,我只会使用其中一种位移位机制。即使在C语言中,如果我想乘以2,我也可能只做乘法,而不是使用移位,unl