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 不支持这些,因此您需要使用函数来代替,这无论如何都更干净。

  • >>是右移,shr在德尔福
  • <<是左移,shl在德尔福
  • &是“按位与”,and在 Delphi 中,
    Delphi 在处理整数时使用位运算符,在处理布尔值时使用逻辑运算符,因此只有一个运算符and可以同时替换&&and &
  • |or在 Delphi 中是“按位或”
  • 0x是十六进制文字的前缀,$在 Delphi 中

所以#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;

(我手头没有delphi,所以可能会有小错误)

以类似的方式转换其他宏。

于 2013-01-15T09:16:50.667 回答