標(biāo)題:
聽說C語言共用體位域操作比位移操作快
[打印本頁]
作者:
a185980800
時(shí)間:
2024-4-11 21:13
標(biāo)題:
聽說C語言共用體位域操作比位移操作快
如題聽說共用體位域操作比位移操作快。下面這個(gè)是我現(xiàn)在用的位操作函數(shù)
//*******************************************************************/
//功能:二進(jìn)制數(shù)位寫入
//形參:shu:待操作的數(shù)。wei:要寫入第幾位(從右到左是0——7位)weiC:為0時(shí)寫入0. 為1時(shí)寫入1
//返回:無
//詳解:
//*******************************************************************/
uint16 uintwei_xie(uint16 shu,unsigned char wei,bit weiC)//功能:二進(jìn)制數(shù)位寫入
{
if(weiC == 0)
{
return shu & (~(0x0001<<wei));
}
else
{
return shu | (0x0001<<wei);
}
}
#endif
復(fù)制代碼
換成共用體不用函數(shù)直接讀寫其實(shí)快,但是不能用變量來指定操作哪一位了,下面是寫出函數(shù)的調(diào)用。
因?yàn)橐{(diào)用函數(shù)還要
switch ()一次,很懷疑還有必要搞嘛。
#include <REG51.H>
// 定義一個(gè)通用的共用體
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;
// 設(shè)置指定位的值
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;
}
// 默認(rèn)返回0,這里可以根據(jù)需要修改
return 0;
}
int main() {
uint16_t data = 0xFFFF;
// 讀取并打印每一位的值
for (int i = 0; i < 16; i++) {
printf("Bit %d: %d\n", i, getBit(&data, i));
}
// 將奇數(shù)位設(shè)置為0
for (int i = 0; i < 16; i++) {
if (i % 2 == 1) {
setBit(&data, i, 0);
}
}
// 打印修改后的值
printf("Modified value: %04X\n", data);
return 0;
}
復(fù)制代碼
作者:
624353765
時(shí)間:
2024-4-12 07:27
使用位域比使用bit變量慢,還有位域是這樣用的嗎
作者:
longdeng84
時(shí)間:
2024-4-12 16:03
現(xiàn)在單片機(jī)的資源都不是很緊缺了,位域操作還有必要不?
作者:
Hephaestus
時(shí)間:
2024-4-14 14:07
如果你的單片機(jī)體系不支持位操作,移位最快。
如果你的單片機(jī)體系支持位操作,請查閱編譯器手冊,比如C51用bdata、bit這些擴(kuò)展關(guān)鍵字,最快。
作者:
1600277881
時(shí)間:
2024-4-15 15:32
這要看你用的是什么核, 51就位操作快, arm就移位快一丁點(diǎn)
作者:
mirvv
時(shí)間:
2024-9-13 10:53
longdeng84 發(fā)表于 2024-4-12 16:03
現(xiàn)在單片機(jī)的資源都不是很緊缺了,位域操作還有必要不?
我用數(shù)碼管顯示的時(shí)候就是用位域的,很節(jié)省空間,讓哪個(gè)數(shù)碼管亮,就用一個(gè)bit位
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1