2011-04-06 121 views
0

自從我編寫C代碼以來,我已經很長時間了。有誰知道如何將這段代碼翻譯成Delphi 2010?C代碼的Delphi等效代碼

char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7); 

其中BUF是char * buf

我知道char *Pchar,但我不知道&~7是什麼。

回答

7

&是按位運算符and

~ id按位一元運算符not

〜圖7是與所有設置爲0。

& ~7的低3位的數,使所有的低3位爲0無論是在左側。

(char *)在賦值的右邊是一個硬鑄鐵到char *

int(buf)buf一個硬鑄鐵爲整數。

這可以編寫代碼,在帕斯卡,像這樣:

var pAlignedBuf: PChar; 
pAlignedBuf := PChar((integer(Buf) + 7) and (not 7)) 

而且這一種方式來獲得一個8字節對齊的緩衝,無論從任何Buf是。它的工作方式是使用7遞增Buf,然後清除低3位。


編輯

爲了安全起見,因爲德爾福64位有點蠢蠢欲動,該代碼可以表示爲:

var pAlignedBuf: PChar; 
pAlignedBuf := PChar(NativeUInt(Buf) + 7) and (not 7)) 

而對於那些不要不喜歡按位邏輯fu,它可以再次被重寫爲:

var pAlignedBuf: PChar; 
pAlignedBuf := PChar(((NativeUInt(Buf) + 7) div 8) * 8); 
+2

注意,D2007和下面字符是一個ANSIChar類型和D2009和上述字符是一個的Unicode字符。鑑於您嘗試使用對齊的內存,我只能假設您可能想要使用PByte或PAnsiChar而不是PChar。 P(Ansi | Wide |)Char的唯一優點是可以使用加號和減號運算符來增加/減少指針,而不是像上面那樣使用指針計算。 – 2011-04-06 23:27:20

4

&是二進制「按位和」運算符,您在Delphi中編寫了and~是一元的「按位不是」運算符,您在Delphi中編寫not

翻譯因此

var 
    PAlignedBuf: PChar; 
begin 
    pAlignedBuf := PChar((cardinal(buf) + 7) and not 7). 

(當然,嚴格來說,直譯是integer(buf),不cardinal(buf),但我認爲cardinal比較好。但我不是100%肯定,因爲我不知道實際情況)。

0

&是按位運算。例如:0b0011 & 0b0110 == 0b0010~是按位取反操作。例如:~0b0111 == 0b1000(假設4位數字)。

0

假設所有的轉換都是合法的,聲明

char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7); 

放入pAlignedBuf所指向的地址buf對齊到8個字節(後3位設置爲0)。

 
    `buf` `pAlignedBuf` 
    0x...420 0x...420 
    0x...421 0x...428 
    0x...422 0x...428 
... 
    0x...427 0x...428 
    0x...428 0x...428 
... 
    0x...429 0x...430