Ibm midrange RPGLE中的位移位
在Java或C等语言中,我们使用了位移位操作数。例如: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,是的……轮班号 你似乎认为用另一种语言所能做的一切都应该
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