亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用C語言進行位域操作

用C語言進行位域操作

C
開心每一天1111 2019-12-21 11:17:18
在C中測試和設置單個整數的經典問題可能是最常見的中級編程技能之一。您可以設置和測試簡單的位掩碼,例如unsigned int mask = 1<<11;if (value & mask) {....} // Test for the bitvalue |= mask;    // set the bitvalue &= ~mask;   // clear the bit一篇有趣的博客文章認為這是容易出錯的,難以維護的并且是錯誤的做法。C語言本身提供了類型安全和可移植的位級別訪問:typedef unsigned int boolean_t;#define FALSE 0#define TRUE !FALSEtypedef union {        struct {                boolean_t user:1;                boolean_t zero:1;                boolean_t force:1;                int :28;                /* unused */                boolean_t compat:1;     /* bit 31 */        };        int raw;} flags_t;intcreate_object(flags_t flags){        boolean_t is_compat = flags.compat;        if (is_compat)                flags.force = FALSE;        if (flags.force) {                [...]        }        [...]}但這讓我畏縮了。我和我的同事對此頗有意思的爭論仍未解決。兩種樣式都可以使用,并且我認為經典的位掩碼方法簡單,安全且清晰。我的同事都認為這是普通且容易的,但是位域聯合方法值得用額外的幾行內容來使其變得更加便攜和安全。雙方還有其他論點嗎?特別是可能存在字節序方法可能遺漏但可能采用字節序的錯誤,但結構方法是否安全?
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

位域并不像您想象的那樣可移植,因為“ C不能保證機器字內的字段順序”(The C book)


忽略這一點,正確使用任何一種方法都是安全的。兩種方法都允許符號訪問整數變量。您可以爭辯說,位域方法更易于編寫,但也意味著需要查看更多代碼。


查看完整回答
反對 回復 2019-12-21
?
胡子哥哥

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); 這將是等效的。


確實,答案是考慮將您想要的東西與想要的方式脫鉤。


查看完整回答
反對 回復 2019-12-21
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

您必須從作家的角度考慮這一點-了解您的聽眾。因此,需要考慮幾個“受眾”。


首先是經典的C程序員,他們掩飾了自己的一生,并且可以在睡眠中做到這一點。


第二個是新手,他不知道||和東西是什么。他們在上一份工作中編程php,現在為您工作。(我說這是做PHP的newb)


如果您寫的是要滿足第一批讀者(全天都是位掩碼)的話,那么會讓他們感到非常高興,并且他們將能夠被蒙住眼睛。但是,新手可能需要克服龐大的學習技巧,才能維護您的代碼。他們將需要了解二進制運算符,如何使用這些操作來設置/清除位,等等。您幾乎肯定會因為newb引入了bug,因為他/她需要所有的技巧才能使其正常工作。


另一方面,如果您為了滿足第二個讀者而寫作,則新手將可以更輕松地維護代碼。他們會有更輕松的時光


 flags.force = 0;


 flags &= 0xFFFFFFFE;

最初的聽眾會變得脾氣暴躁,但是很難想象他們將無法理解和維護新的語法。搞砸起來要困難得多。不會有新的錯誤,因為newb可以更輕松地維護代碼。您將獲得有關“如何回想起我今天需要穩定的手和磁化的針來設置位...我們什至沒有位罩!”的講座。(感謝XKCD)。


因此,我強烈建議使用位掩碼上的字段來使代碼安全。


查看完整回答
反對 回復 2019-12-21
  • 3 回答
  • 0 關注
  • 608 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號