2017-06-15 45 views
0

我使用的语言如Java或C,我们必须使用位移位操作数。例如:RPGLE的位移

myValue <<= 1 

我该如何在RPGLE中完成同样的事情? (如果可能的话)

回答

2

对于< <,除以2,4,8等。对于>>,乘以2,4,8等

从n = 1时,2得到的2,4,8等3,使用%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;           
+0

你击败了我的更新:)编译器是否优化了这样一个操作来进行位移? – Charles

+0

@Charles我一直在寻找性能的位移,但我认为这不是最佳选择。我的意思是,这是位移的更高级别的“抽象”。 – LppEdd

+0

RPG编译器不会优化到位移。我不知道优化翻译是否会这样做。 –

1

你不能。

AND,OR,XOR,yes ... shift no。

你似乎认为你可以用另一种语言做的所有事情都应该可以在RPG中实现。这不是......没关系。关于ILE的好处是你可以很容易地创建一个C程序,如果你需要它可以在RPG中进行位移和调用。

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

1

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

所以,如果你有一个C函数调用ishiftl该转移的整数左:

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函数的原型,芭芭拉莫里斯写了一张备忘单来帮助。它位于here

+0

当然,函数调用否定了使用位移时可能获得的任何性能优势,作为语言功能与乘法或除法。 – jmarkmurphy

+0

也许过早优化? – jmarkmurphy

+0

也许哈哈哈:) – LppEdd