提取十六进制数的“部分”

时间:2010-02-16 13:45:19

标签: c++ c bit-manipulation

我想写一个函数getColor(),它允许我提取输入为long的十六进制数字的部分

详情如下:

//prototype and declarations
enum Color { Red, Blue, Green };

int getColor(const long hexvalue, enum Color);

//definition (pseudocode)
int getColor(const long hexvalue, enum Color)
{
   switch (Color)
   {
      case Red:
         ; //return the LEFTmost value (i.e. return int value of xAB if input was 'xABCDEF')
       break;

      case Green:
         ; //return the 'middle' value (i.e. return int value of xCD if input was 'xABCDEF')
       break;

      default: //assume Blue
         ; //return the RIGHTmost value (i.e. return int value of xEF if input was 'xABCDEF')
       break;
    }
}

我'有点笨拙'不像过去那样。我很感激你的帮助。

[编辑] 我改变了switch语句中颜色常量的顺序 - 毫无疑问,任何设计师,CSS爱好者都会注意到颜色被定义为(在RGB比例中)为RGB;)

2 个答案:

答案 0 :(得分:13)

一般而言:

  1. 先转换
  2. 面具最后
  3. 所以,例如:

    case Red:
           return (hexvalue >> 16) & 0xff;
    case Green:
           return (hexvalue >> 8) & 0xff;
    default: //assume Blue
           return hexvalue & 0xff;
    

    操作的顺序有助于减少掩码所需的文字常量的大小,这通常会导致更小的代码。

    我接受了DNNX的评论,并改变了组件的名称,因为订单通常是RGB(而不是RBG)。

    此外,注意,当您对整数类型进行操作时,这些操作与“十六进制”数无关。十六进制是一种符号,一种以文本形式表示数字的方式。数字本身不是以十六进制格式存储的,它与计算机中的其他内容一样是二进制文件。

答案 1 :(得分:0)

switch (Color)
{
  case Red:
     return (hexvalue >> 16) & 0xff;

  case Blue:
     return (hexvalue >> 8) & 0xff;

  default: //assume Green
     return hexvalue & 0xff;

}