Delphi等效的C代码

时间:2011-04-06 14:46:42

标签: c delphi delphi-2010 translation

自从我编写C代码以来,我已经很久了。有谁知道如何将这段代码翻译成Delphi 2010?

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

其中buf为char * buf

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

4 个答案:

答案 0 :(得分:7)

&是按位and运算符。

~ ID为按位一元not运算符。

~7是一个数字,所有低3位都设置为0。

& ~7使左下角的所有低3位为0。

分配右侧的(char *)char *

的强制转换

int(buf)buf到整数的强硬演员。

该代码可以用pascal编写,如下所示:

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

这是从Buf获得的8字节对齐缓冲区的一种方法。它的工作原理是将Buf增加7,然后清除低3位。


修改

为了安全起见,由于Delphi 64位即将到来,该代码可以表示为:

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

对于那些不喜欢按位逻辑fu的人,它可以再次重写为:

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

答案 1 :(得分:4)

&是二进制“按位和”运算符,您在Delphi中编写and~是一元“按位非”运算符,您在Delphi中编写not

因此,翻译

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

(严格来说,字面翻译是integer(buf),而不是cardinal(buf),但我认为cardinal更好。但我不是百分百肯定,因为我不知道实际案例。)

答案 2 :(得分:0)

&是按位和操作。示例:0b0011 & 0b0110 == 0b0010~是按位否定操作。示例:~0b0111 == 0b1000(假设为4位数字)。

答案 3 :(得分: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