3 回答

TA貢獻1866條經驗 獲得超5個贊
位域并不像您想象的那樣可移植,因為“ C不能保證機器字內的字段順序”(The C book)
忽略這一點,正確使用任何一種方法都是安全的。兩種方法都允許符號訪問整數變量。您可以爭辯說,位域方法更易于編寫,但也意味著需要查看更多代碼。

TA貢獻1825條經驗 獲得超6個贊
如果問題在于設置和清除位容易出錯,那么正確的做法是編寫函數或宏以確保正確執行。
// off the top of my head
#define SET_BIT(val, bitIndex) val |= (1 << bitIndex)
#define CLEAR_BIT(val, bitIndex) val &= ~(1 << bitIndex)
#define TOGGLE_BIT(val, bitIndex) val ^= (1 << bitIndex)
#define BIT_IS_SET(val, bitIndex) (val & (1 << bitIndex))
如果您不介意val必須是左值(除BIT_IS_SET以外),這將使代碼可讀。如果那不能使您滿意,那么您可以取出作業,用括號括起來并用作val = SET_BIT(val,someIndex); 這將是等效的。
確實,答案是考慮將您想要的東西與想要的方式脫鉤。

TA貢獻1799條經驗 獲得超6個贊
您必須從作家的角度考慮這一點-了解您的聽眾。因此,需要考慮幾個“受眾”。
首先是經典的C程序員,他們掩飾了自己的一生,并且可以在睡眠中做到這一點。
第二個是新手,他不知道||和東西是什么。他們在上一份工作中編程php,現在為您工作。(我說這是做PHP的newb)
如果您寫的是要滿足第一批讀者(全天都是位掩碼)的話,那么會讓他們感到非常高興,并且他們將能夠被蒙住眼睛。但是,新手可能需要克服龐大的學習技巧,才能維護您的代碼。他們將需要了解二進制運算符,如何使用這些操作來設置/清除位,等等。您幾乎肯定會因為newb引入了bug,因為他/她需要所有的技巧才能使其正常工作。
另一方面,如果您為了滿足第二個讀者而寫作,則新手將可以更輕松地維護代碼。他們會有更輕松的時光
flags.force = 0;
比
flags &= 0xFFFFFFFE;
最初的聽眾會變得脾氣暴躁,但是很難想象他們將無法理解和維護新的語法。搞砸起來要困難得多。不會有新的錯誤,因為newb可以更輕松地維護代碼。您將獲得有關“如何回想起我今天需要穩定的手和磁化的針來設置位...我們什至沒有位罩!”的講座。(感謝XKCD)。
因此,我強烈建議使用位掩碼上的字段來使代碼安全。
- 3 回答
- 0 關注
- 608 瀏覽
添加回答
舉報