将单词拆分为两个字节的最快方法

时间:2013-07-25 11:09:29

标签: c++ c performance bit-manipulation operation

那么将一个单词分成两个字节的最快方法是什么?

short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;

short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;

修改

怎么样

short s = 0x3210;
char* c = (char*)&s; // where c1 = c[0] and c2 = c[1]

4 个答案:

答案 0 :(得分:7)

让编译器为您完成这项工作。使用union,其中字节将被拆分而不需要任何手动位移。看一下伪代码:

union U {
  short s;  // or use int16_t to be more specific
  //   vs.
  struct Byte {
    char c1, c2;  // or use int8_t to be more specific
  }
  byte;
};

用法很简单:

U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;

这个概念很简单,之后你可以重载操作符,使它更加花哨。

重要的是要注意,根据您的编译器,c1c2的顺序可能不同,但在编译之前将会知道。您可以设置一些条件宏,以确保在任何编译器中根据您的需要进行排序。

答案 1 :(得分:6)

我99.9%肯定第一个至少与几乎所有架构中的第二个一样快。可能有一些架构没有区别(它们是相同的),而在一些架构中,后者会更慢。

我说第二个较慢的主要原因是c2号有两个班次。处理器在完成第一次换班之前无法开始处理第二班次。

此外,编译器可能能够使用第一个聪明的东西(如果有指令要做 - 例如x86处理器可以将s加载到AX中,并将AL存储到{{ 1}}和AH进入c1 - 除了存储操作之外没有额外的指令),其中第二个不太可能是“已知的常见模式”(我当然从未见过在代码中使用该变体,其中c2方法非常常用 - 通常在“像素循环”中,这意味着对它实现良好的优化至关重要。)

与往常一样,再次进行测量,测量和测量。除非您只对您的特定机器性能感兴趣,否则请在不同型号/制造商的处理器上进行尝试,这样您就不会在机器型号上制作5%的速度,而在另一种机型上制作速度要慢20%。

答案 2 :(得分:1)

你当然应该使用强制转换而不是掩码或两个移位来提取低位字节。然后编译器将执行它已知的最快的任何事情。这会让你得到高位,只有一个选择。

答案 3 :(得分:1)

您应该在for (long i = 0; i < 100000000; i++)中为每个人计时。我做了,第一个更快(0.82秒对0.84秒)。在MVS中这样做的一种简单方法是在@clk上设置监视。