2017-06-15 49 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