前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >翻转字节的高端写法

翻转字节的高端写法

作者头像
我不是码神
发布2022-07-28 14:23:45
3160
发布2022-07-28 14:23:45
举报
文章被收录于专栏:流媒体技术流媒体技术

在解析协议的时候,需要将一个大端字序的整数,转成小端字序,比如内存中有[1,2,3,4]四个字节,我们需要翻转成[4,3,2,1]。

(u8是8位无符号整数类型)

循环写法

代码语言:javascript
复制
void reverse(u8 *a, u8 *b)
{
    for(int i =0;i<4;i++){
        a[i] = b[3-i]
    }
}

硬编码

代码语言:javascript
复制
void reverse(u8 *a, u8 *b)
{
    *a = *b
    *(a+1) = *(b-1)
    *(a+2) = *(b-2)
    *(a+3) = *(b-3)
}

循环可以处理位数不定的情况,硬编码写的累,但执行效率高一些,如何让鱼和熊掌兼得呢?

位数不定的“硬编码”

这时候C++的模版函数大显身手了,请看如下代码

代码语言:javascript
复制
template <int N>
inline void reverse(u8 *a, u8 *b)
{
    *a = *b;
    reverse<N - 1>(a + 1, b - 1);
}
template <>
inline void reverse<1>(u8 *a, u8 *b)
{
    *a = *b;
}

模版参数除了常见的替换类型以外,还有这种传递一个整数常量的方式。当我们调用这个reverse函数的时候,编译器会在编译阶段展开函数,由于内部我们递归调用了reverse,编译器会递归的展开这个函数。

这里我们用到了模板函数的特化,编译器会在特定条件(这里是N=1)的情况下使用特化的模板函数,从而终止递归调用。

函数展开后,相当于:(伪代码)

代码语言:javascript
复制
void reverse(u8 *a, u8 *b)
{
    *a = *b
    *(a+1) = *(b-1)
    *(a+2) = *(b-2)
    *(a+3) = *(b-3)
……
    *(a+n) = *(b-n)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 循环写法
  • 硬编码
  • 位数不定的“硬编码”
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档