c++ - 将位从一个数组转换为另一个数组?

标签 c++ bit-manipulation atmel atmega lcd

我正在为这个真空荧光显示器构建一个库。它的界面非常简单,我可以使用所有功能。

我现在遇到的问题是我试图使代码尽可能紧凑,但自定义字符加载并不直观。那是字体的位图映射到与显示本身完全不同的位和字节。来自IEE VFD datasheet ,当您向下滚动时,您会看到这些位已映射到各处。

我目前的代码是这样工作的:

// input the font bitmap, the bit from that line of the bitmap and the bit it needs to go to
static unsigned char VFD_CONVERT(const unsigned char* font, unsigned char from, unsigned char to) {
return ((*font >> from) & 0x01) << to;
//return (*font & (1 << from)) ? (1<<to) : 0;
}
// macros to make it easyer to read and see
#define CM_01 font+0, 4
#define CM_02 font+0, 3
#define CM_03 font+0, 2
#define CM_04 font+0, 1
#define CM_05 font+0, 0

// One of the 7 lines I have to send
   o = VFD_CONVERT(CM_07,6) | VFD_CONVERT(CM_13,5) | VFD_CONVERT(CM_30,4) | VFD_CONVERT(CM_23,3) | VFD_CONVERT(CM_04,2) | VFD_CONVERT(CM_14,1) | VFD_CONVERT(CM_33,0);
send(o);

这显然不是全部代码。你可以看到其余的 my Google code repository但它应该让您了解我在做什么。

所以我的问题是,是否有更好的方法来优化它或进行翻译?

更改 VFD_CONVERT 上的返回语句会使 GCC 变得疯狂(-O1、-O2、-O3 和 -Os 这样做)并将代码扩展到 1400 字节。如果我将 return 语句与内联 if 一起使用,它会将其减少到 800 个字节。我一直在浏览 asm 生成的语句,目前我很想把它全部写在 asm 中,因为我开始认为编译器不知道它在做什么。但是我想也许是我,我不知道自己在做什么,所以它让编译器感到困惑。

作为旁注,那里的代码有效,两个返回语句都会上传自定义字符并显示出来(有一个奇怪的错误,我必须发送两次,但这是一个单独的问题)。

最佳答案

首先,你应该用一个最小的例子来提交一份针对 gcc 的错误报告,因为 -Os 永远不会生成比 -O0 更大的代码。然后,我建议将排列存储在表中,如下所示

const char[][] perm = {{ 7, 13, 30, 23,  4, 14, 33}, ...

具有表示固定零位或一位的特殊值。这也会使您的代码更具可读性。

关于c++ - 将位从一个数组转换为另一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21175759/

相关文章:

c - LED 保持亮起。不会打开和关闭

c++ - 如何定位一段时间内的某一系列汇编指令?

c++ - 在 Visual Studio 中发布版本仍然更慢?

c++ - 创建一个包含要绘制的项目的类(段错误)

c++ - 按位旋转(循环移位)

c - 如何有效地计算 bigint 值中设置位的索引?

assembly - 对 68HC12 上的一个字节进行位反转

linux - 通过软件控制 USB 灯

c++ - 在编译时检测或避免对临时文件的无效引用

c - 如何使用 Arduino - atmega 2560 微 Controller 实现 8 位 DAC(数模转换)?