2

私はCコードを持っています。それを Delphi コードに変換するのに助けが必要です。

1)

/*
 * Color is packed into 16-bit word as follows:
 *
 *  15      8 7      0 
 *   XXggbbbb XXrrrrgg
 *
 * Note that green bits 12 and 13 are the lower bits of green component
 * and bits 0 and 1 are the higher ones.
 * 
 */
#define CLR_RED(spec)      (((spec) >> 2) & 0x0F)
#define CLR_GREEN(spec)    ((((spec) & 0x03) << 2) | ((spec & 0x3000) >> 12))
#define CLR_BLUE(spec)     (((spec) >> 8) & 0x0F)

2)

#define CDG_GET_SCROLL_COMMAND(scroll)    (((scroll) & 0x30) >> 4)
#define CDG_GET_SCROLL_HOFFSET(scroll)     ((scroll) & 0x07)
#define CDG_GET_SCROLL_VOFFSET(scroll)     ((scroll) & 0x0F)
4

1 に答える 1

11

これらはパラメーター化されたマクロです。Delphiはこれらをサポートしていないため、代わりに関数を使用する必要があります。これはとにかくクリーンです。

  • >>shrDelphiでは右シフトです
  • <<shlDelphiでは左シフトです
  • &は「ビット単位と」です。Delphiでは、andDelphi
    は整数を処理するときにビット演算子を使用し、ブール値を処理するときに論理演算子を使用するため、との両方を置き換える演算子は1つだけandです。&&&
  • |orDelphiでは「ビット単位または」です
  • 0x$Delphiでは、16進リテラルのプレフィックスです。

したがって#define CLR_GREEN(spec) ((((spec) & 0x03) << 2) | ((spec & 0x3000) >> 12))、次のようになります。

function CLR_GREEN(spec: word):byte;
begin
  result := byte(((spec and $03) shl 2) or ((spec and $3000) shr 12));
end;

(私は手元にデルファイを持っていないので、マイナーなバグがあるかもしれません)

同様の方法で他のマクロを変換します。

于 2013-01-15T09:16:50.667 に答える