当前位置:首页 > 原创 > 振南技术干货集(风云录)
[导读]我给大家出一道有意思的题目:如何快速得到一个字节的位逆序字节。比如0X33的位逆序字节是0XCC。

字节快速位逆序

我给大家出一道有意思的题目:如何快速得到一个字节的位逆序字节。比如0X33的位逆序字节是0XCC。

有人给了我这样一段代码:

这段代码很简洁,也很巧妙。但是它却不是最快的。后来作了改进:

这样把循环打开,确实会提速不少。但它仍不是最快的实现方案。请看如下代码:

恍然大悟了没有?使用字节数组事先准备好位逆序字节,然后直接以字节的值为下标索引,直接取数据即可。这种方法被称为“空间换时间”。

这个问题我问过很多人,多数人并不能直接给出最佳方案。倒是有不少人问我这个问题有什么实际意义,为什么要去计算位逆序字节?请大家想想,如果我们把电路上的数据总线焊反或插反了该怎么解决。

关于volatile

现在的编译器越来越智能,它们会对我们的代码进行不同程度的优化。请看下例:

unsigned char a;

a=1;

a=2;

a=3;

这样一段代码,有些编译器会认为a=1与a=2根本就是毫无意义,会把它们优化掉,只剩下a=3。但是,有些时候这段代码是有特殊用途的:

unsigned charxdata a _at_ 0X1111;

a=1;

a=2;

a=3;

a不单单是一个变量,而是一个外部总线的端口(51平台)。向它赋值会产生相应的外部总线上的时序输出,从而对外部器件实现控制。这种时候,a=1和a=2不能被优化掉。举个例子:a所指向的外部总线端口,是一个电机控制器的接口,向它写入1是加速,写入2是减速,写入3是反向。那么上面的代码就是加速->减速->反向,这样一个控制过程。如果被优化的话,那最后就只有反向了。

为了防止这种被“意外”伦的情况发生,我们可以在变量的定义上加一个修饰词volatile。

volatile unsigned charxdata a _at_ 0X1111;

a=1;

a=2;

a=3;

这样,编译器就会对它单独对待,不再优化了。

volatile最常出现的地方,就是对芯片中寄存器的定义,比如STM32固件库中有这样的代码:

#define __IO volatile

typedef struct

{

__IO uint32_t CRL;

__IO uint32_t CRH;

__IO uint32_t IDR;

__IO uint32_t ODR;

__IO uint32_t BSRR;

__IO uint32_t BRR;

__IO uint32_t LCKR;

} GPIO_TypeDef;

这是对STM32的GPIO寄存器组的定义,每一项都是一个__IO类型,其实就是volatile。这样是为了对片内外设的物理寄存器的访问一定是真正落实的,而不是经过编译器优化,而变成去访问缓存之类的东西。

声明:该篇文章为本站原创,未经授权不予转载,侵权必究。
换一批
延伸阅读

在C语言中,volatile关键字通过约束编译器优化行为,为多线程编程、硬件寄存器访问等场景提供底层语义支持。其核心作用在于解决变量值可能被外部因素(如硬件、中断、其他线程)修改时,编译器优化导致的内存访问不一致问题。这...

关键字: C语言 volatile

CPU的大小端模式‌是指在存储和处理多字节数据时,字节的顺序是如何排列的。它涉及到字节在内存中的存储方式以及读取和解释这些字节的顺序。主要有两种大小端模式:‌大端模式(Big-Endian)‌和‌小端模式(Little-...

关键字: CPU 字节

最新消息,近日字节跳动 CEO梁汝波在2024年年度全员会上表示,2019-2021年,字节跳动快速扩张,员工数量从1万多增加到10万多人,不少人反馈现在字节该有的大公司病全有了。同时强调该公司今年的关键词为“始终创业,...

关键字: CEO 梁汝波 字节

业内消息,近日有消息称字节跳动调整了薪酬结构,将原来年终奖月数大于3的薪酬方案统一调整为3个月,也就是说年薪总包不变,月薪上升幅度约20%。官方在通知邮件中表示,此举主要是为提升管理效率。

关键字: 字节 期权 激励

最新消息,针对「字节跳动旗下游戏部门朝夕光年正与腾讯谈判出售多款游戏」一事,昨天晚间朝夕光年相关负责人回应称,相关团队还在与多个买家商谈项目出售事宜,至今尚未敲定任何与腾讯的交易。

关键字: 朝夕光年 腾讯 游戏 字节

memcpy函数的功能是用来作内存搬运,就是将数据从一个数组赋值到另一个数组。它的实现很简单:

关键字: memcpy C 语言 串化

初学C语言的时候,有一个小编程题我们应该都记得,就是变量互换。

关键字: 变量互换 sizeof C 语言

补码是一个很基础的概念,但是对于很多人来说,其实有些迷糊,这里对补码进行一些通俗而深刻的讲解。

关键字: C 语言 补码 CPU

另外,有时候优先级还与C语言编译器有关,同一个表达式在不同的平台上,可能表达的意义是不同的。所以,为了代码的可植移性、正确性以及可读性,振南强烈建议多用一些()。

关键字: C 语言 编程语言 赋值操作

我们本希望循环5次,然后结束,但是实际情况是陷入了死循环。这种错误在实际开发中,还比较难发现。其原因在于i的类型,无符号整型是永远不小于0的。我们需要将i的类型改为有符号型。

关键字: 死循环 C 语言 空循环
关闭