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

Jon*_*nas 3 c c++ performance bit-manipulation operation

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

short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;
Run Code Online (Sandbox Code Playgroud)

short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;
Run Code Online (Sandbox Code Playgroud)

编辑

怎么样

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

iam*_*ind 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;
};
Run Code Online (Sandbox Code Playgroud)

用法很简单:

U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;
Run Code Online (Sandbox Code Playgroud)

这个概念很简单,之后您可以重载操作符,以便在需要时使其更具花哨性.

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


Mat*_*son 6

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

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

此外,编译器可能能够用第一个做其他聪明的东西(如果有指令要做 - 例如x86处理器可以加载s到AX,并将AL存储到c1AH中c2- 除了商店之外没有额外的指令操作),其中第二个不太可能是"已知的共同模式"(我当然从未见过在代码中使用该变体,其中该shift/and方法非常常用 - 通常在"像素循环"中,这意味着它很关键为它实现良好的优化).

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