I语言,如Java或C,我们必须使用位移位操作数。示例:
myValue <<= 1我如何在RPGLE中完成同样的任务?(如有可能)
发布于 2017-06-15 13:34:52
对于<<,除以2,4,8等,对于>>,乘以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; 发布于 2017-06-15 13:32:58
你不能这么做。
和,OR,XOR,yes...shift no.
你似乎认为用另一种语言所能做的一切都应该在RPG中实现。没事的是not...and。关于ILE的伟大之处在于,您可以轻松地创建一个C过程,如果需要的话,它可以进行位转换,并从RPG调用它。
当然,您可以乘以/除以2^n....same结果,而且编译器可能会将其优化为一个移位。但是您必须使用一个无符号整数变量。
发布于 2017-06-15 14:43:09
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不区分大小写,所有标识符都被隐式转换为大写。因此,在定义C函数的情况下,需要ExtProc(' name ')显式定义C函数的名称。此外,还有一些事情需要记住。一个是C按值传递参数。如果您不太熟悉如何在RPG中实现C函数的原型,芭芭拉·莫里斯( Barbara )就写了一份小抄来帮助你。它位于这里。
https://stackoverflow.com/questions/44560356
复制相似问题