如題聽說共用體位域操作比位移操作快。下面這個是我現在用的位操作函數- //*******************************************************************/
- //功能:二進制數位寫入
- //形參: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;
- }
復制代碼
|