第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

用C語言進(jìn)行位域操作

用C語言進(jìn)行位域操作

C
開心每一天1111 2019-12-21 11:17:18
在C中測試和設(shè)置單個整數(shù)的經(jīng)典問題可能是最常見的中級編程技能之一。您可以設(shè)置和測試簡單的位掩碼,例如unsigned int mask = 1<<11;if (value & mask) {....} // Test for the bitvalue |= mask;    // set the bitvalue &= ~mask;   // clear the bit一篇有趣的博客文章認(rèn)為這是容易出錯的,難以維護(hù)的并且是錯誤的做法。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) {                [...]        }        [...]}但這讓我畏縮了。我和我的同事對此頗有意思的爭論仍未解決。兩種樣式都可以使用,并且我認(rèn)為經(jīng)典的位掩碼方法簡單,安全且清晰。我的同事都認(rèn)為這是普通且容易的,但是位域聯(lián)合方法值得用額外的幾行內(nèi)容來使其變得更加便攜和安全。雙方還有其他論點(diǎn)嗎?特別是可能存在字節(jié)序方法可能遺漏但可能采用字節(jié)序的錯誤,但結(jié)構(gòu)方法是否安全?
查看完整描述

3 回答

?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個贊

位域并不像您想象的那樣可移植,因?yàn)椤?C不能保證機(jī)器字內(nèi)的字段順序”(The C book)


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


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

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個贊

如果問題在于設(shè)置和清除位容易出錯,那么正確的做法是編寫函數(shù)或宏以確保正確執(zhí)行。


// 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以外),這將使代碼可讀。如果那不能使您滿意,那么您可以取出作業(yè),用括號括起來并用作val = SET_BIT(val,someIndex); 這將是等效的。


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


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

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個贊

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


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


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


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


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


 flags.force = 0;


 flags &= 0xFFFFFFFE;

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


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


查看完整回答
反對 回復(fù) 2019-12-21
  • 3 回答
  • 0 關(guān)注
  • 611 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號