Delphi эквивалентный код кода C - PullRequest
0 голосов
/ 06 апреля 2011

Я давно не писал C-код.Кто-нибудь знает, как перевести этот кусок кода в Delphi 2010?

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

где buf char * buf.

Я знаю, что char * это Pchar, но я незнать, что такое & и ~7.

Ответы [ 4 ]

7 голосов
/ 06 апреля 2011

& - побитовый оператор and.

~ id - битовый унарный оператор not.

~ 7 - это число со всеми установленными младшими 3 битамив 0.

& ~7 делает все младшие 3 бита 0 для того, что находится слева.

(char *) справа от назначения - это жесткое приведение к char *

int(buf) - это жесткое приведение buf к целому числу.

Этот код можно записать на паскале следующим образом:

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

И этоспособ получить 8-байтовый выровненный буфер из Buf.Он работает, увеличивая Buf на 7, а затем сбрасывая младшие 3 бита.


Редактировать

Чтобы быть в безопасности, так как Delphi 64 bitнемного за углом, этот код может быть выражен как:

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

А для тех, кто не любит побитовую логику-фу, он может быть снова переписан как:

var pAlignedBuf: PChar;
pAlignedBuf := PChar(((NativeUInt(Buf) + 7) div 8) * 8);
4 голосов
/ 06 апреля 2011

& - это двоичный оператор «побитово и», который вы пишете and в Delphi. ~ - это унарный оператор "bitwise not", который вы пишете not в Delphi.

Поэтому перевод

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

(Строго говоря, буквальный перевод - integer(buf), а не cardinal(buf), но я думаю, что cardinal лучше. Но я не уверен на 100%, поскольку не знаю фактического случая.)

0 голосов
/ 06 апреля 2011

Предполагая, что все приведенные значения допустимы, оператор

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
0 голосов
/ 06 апреля 2011

& - побитовая операция. Пример: 0b0011 & 0b0110 == 0b0010. ~ - операция побитового отрицания. Пример: ~0b0111 == 0b1000 (при условии 4-битных чисел).

...