德尔菲等效于C码的代码



我已经很久没有写C代码了。有谁知道如何将这段代码翻译成Delphi 2010?

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

布夫char * buf的地方。

我知道char *Pchar,但我不知道&~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);

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

因此,翻译是

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

(嗯,严格来说,直译是integer(buf),不是cardinal(buf),但我认为cardinal更好。但我不是100%确定,因为我不知道实际情况。

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

假设所有演员都是合法的,声明

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

最新更新