如题听说共用体位域操作比位移操作快。下面这个是我现在用的位操作函数- //*******************************************************************/
- //功能:二进制数位写入
- //形参: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;
- }
复制代码
|