自从我编写C代码以来,我已经很久了。有谁知道如何将这段代码翻译成Delphi 2010?
char * pAlignedBuf = (char *) ((int(buf) + 7) & ~7);
其中buf为char * buf
。
我知道char *
是Pchar
,但我不知道&
和~7
是什么。
答案 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