首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一个单词分割成两个字节的最快方法

将一个单词分割成两个字节的最快方法
EN

Stack Overflow用户
提问于 2013-07-25 11:09:29
回答 4查看 8.3K关注 0票数 4

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

代码语言:javascript
复制
short s = 0x3210;
char c1 = s >> 8;
char c2 = s & 0x00ff;

对比

代码语言:javascript
复制
short s = 0x3210;
char c1 = s >> 8;
char c2 = (s << 8) >> 8;

编辑

怎么样

代码语言:javascript
复制
short s = 0x3210;
char* c = (char*)&s; // where c1 = c[0] and c2 = c[1]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-25 11:19:53

我99.9%确信,在几乎所有的架构中,第一个架构的速度至少与第二个体系结构的速度一样快。可能有些体系结构没有什么区别(它们是相等的),而在几个体系结构中,后者会慢一些。

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

此外,编译器很可能能够对第一个模式执行其他聪明的操作(如果有这样的指令--例如,x86处理器可以将s加载到AX中,并将AL存储到c1中,将AL存储到c2中--而不是存储操作之外的额外指令),在存储操作之外,第二个指令不太可能是“已知的公共模式”(我肯定从未见过在代码中使用该变体--通常在“像素循环”中使用shift/and方法,这意味着为它实现良好的优化至关重要)。

像往常一样,测量,测量,再测量。除非您只对特定的机器性能感兴趣,请在不同的型号/处理器制造商上尝试它,这样您就不会在您的机器模型上制造速度快5%的产品,而在另一种型号上制造速度会慢20%。

票数 6
EN

Stack Overflow用户

发布于 2013-07-25 11:31:19

让编译器为您完成此工作。使用union,在这种情况下,字节将被分割而不需要任何手工的位移位。看看伪代码:

代码语言:javascript
复制
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;
};

用法很简单:

代码语言:javascript
复制
U u;
u.s = 0x3210;
std::cout << u.byte.c1 << " and " << u.byte.c2;

这个概念很简单,之后你可以让操作符过载,如果你想的话,可以让它变得更花哨。

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

票数 7
EN

Stack Overflow用户

发布于 2013-07-25 11:33:24

当然,您应该使用一个强制转换,而不是一个掩码或两个轮班来提取低阶字节。然后编译器将做它已经知道最快的事情。这就给你留下了一个只有一个选择的高阶位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17856329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档