标题:
听说C语言共用体位域操作比位移操作快
[打印本页]
作者:
a185980800
时间:
2024-4-11 21:13
标题:
听说C语言共用体位域操作比位移操作快
如题听说共用体位域操作比位移操作快。下面这个是我现在用的位操作函数
//*******************************************************************/
//功能:二进制数位写入
//形参:shu:待操作的数。wei:要写入第几位(从右到左是0——7位)weiC:为0时写入0. 为1时写入1
//返回:无
//详解:
//*******************************************************************/
uint16 uintwei_xie(uint16 shu,unsigned char wei,bit weiC)//功能:二进制数位写入
{
if(weiC == 0)
{
return shu & (~(0x0001<<wei));
}
else
{
return shu | (0x0001<<wei);
}
}
#endif
复制代码
换成共用体不用函数直接读写其实快,但是不能用变量来指定操作哪一位了,下面是写出函数的调用。
因为要调用函数还要
switch ()一次,很怀疑还有必要搞嘛。
#include <REG51.H>
// 定义一个通用的共用体
typedef union {
uint16_t value16;
struct {
bit bit0;
bit bit1;
bit bit2;
bit bit3;
bit bit4;
bit bit5;
bit bit6;
bit bit7;
bit bit8;
bit bit9;
bit bit10;
bit bit11;
bit bit12;
bit bit13;
bit bit14;
bit bit15;
} bits16;
} BitField;
// 设置指定位的值
void setBit(uint16_t *data, int index, bit value) {
BitField *bf = (BitField *)data;
switch (index) {
case 0: bf->bits16.bit0 = value; break;
case 1: bf->bits16.bit1 = value; break;
case 2: bf->bits16.bit2 = value; break;
case 3: bf->bits16.bit3 = value; break;
case 4: bf->bits16.bit4 = value; break;
case 5: bf->bits16.bit5 = value; break;
case 6: bf->bits16.bit6 = value; break;
case 7: bf->bits16.bit7 = value; break;
case 8: bf->bits16.bit8 = value; break;
case 9: bf->bits16.bit9 = value; break;
case 10: bf->bits16.bit10 = value; break;
case 11: bf->bits16.bit11 = value; break;
case 12: bf->bits16.bit12 = value; break;
case 13: bf->bits16.bit13 = value; break;
case 14: bf->bits16.bit14 = value; break;
case 15: bf->bits16.bit15 = value; break;
}
}
// 获取指定位的值
bit getBit(uint16_t *data, int index) {
BitField *bf = (BitField *)data;
switch (index) {
case 0: return bf->bits16.bit0;
case 1: return bf->bits16.bit1;
case 2: return bf->bits16.bit2;
case 3: return bf->bits16.bit3;
case 4: return bf->bits16.bit4;
case 5: return bf->bits16.bit5;
case 6: return bf->bits16.bit6;
case 7: return bf->bits16.bit7;
case 8: return bf->bits16.bit8;
case 9: return bf->bits16.bit9;
case 10: return bf->bits16.bit10;
case 11: return bf->bits16.bit11;
case 12: return bf->bits16.bit12;
case 13: return bf->bits16.bit13;
case 14: return bf->bits16.bit14;
case 15: return bf->bits16.bit15;
}
// 默认返回0,这里可以根据需要修改
return 0;
}
int main() {
uint16_t data = 0xFFFF;
// 读取并打印每一位的值
for (int i = 0; i < 16; i++) {
printf("Bit %d: %d\n", i, getBit(&data, i));
}
// 将奇数位设置为0
for (int i = 0; i < 16; i++) {
if (i % 2 == 1) {
setBit(&data, i, 0);
}
}
// 打印修改后的值
printf("Modified value: %04X\n", data);
return 0;
}
复制代码
作者:
624353765
时间:
2024-4-12 07:27
使用位域比使用bit变量慢,还有位域是这样用的吗
作者:
longdeng84
时间:
2024-4-12 16:03
现在单片机的资源都不是很紧缺了,位域操作还有必要不?
作者:
Hephaestus
时间:
2024-4-14 14:07
如果你的单片机体系不支持位操作,移位最快。
如果你的单片机体系支持位操作,请查阅编译器手册,比如C51用bdata、bit这些扩展关键字,最快。
作者:
1600277881
时间:
2024-4-15 15:32
这要看你用的是什么核, 51就位操作快, arm就移位快一丁点
作者:
mirvv
时间:
2024-9-13 10:53
longdeng84 发表于 2024-4-12 16:03
现在单片机的资源都不是很紧缺了,位域操作还有必要不?
我用数码管显示的时候就是用位域的,很节省空间,让哪个数码管亮,就用一个bit位
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1