看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hsm926 (韓森慢)》之銘言: : 使用Dev c++ : 想請問如果要將某bit變為1,卻不影響其他bits : 可以寫成 : int i=11; //00001011 : i = i | (1<<2); //將第二位變為1 : printf("%d", i); //等於15,00001111 : ---------------------------------------------------------- : 如果反過來要將某bit變為0,卻不影響其他bits : 我的想法是 : int j=15; //00001111 : if(j & (1<<2)) //判斷要變換的bit是否為1 : j -= (1<<2) //是1就減掉 : printf("%d",j); //等於11,00001011 先講結論好了,要用位元運算,用無號整數比較穩。更穩的方法是用 uintXX_t 系列... 以下專心講 C99 給想知道內情的人看: C99 的整數的位元分三個部份:值、正負號、填充(padding)。用了 無號整數可以避開正負號的問題。使用 uintN_t 可以再確保寬度有多大。 順便澄清一件事情,那就是 << 和 >> 並不是真的用位元來定義,而是用 乘法和除法的商數來定義。然而 ^ ~ & | 等等就真的是位元硬碰硬了。 正負號有點麻煩,因為 C 標準的有號整數可以有三種實作方法,每種 實作方法都有可能產生陷阱(trap)。若使用 intN_t 系列,則可以保證 一定是二補數,比用 int 更能保證在每個機器上都會對。當然最好還是用 無號整數,徹底避開這個問題。 : → tropical72:http://codepad.org/Chr2zQnL 08/18 03:38 另外 tropical72 大的程式碼中 | unsigned mask=0xf0000000; 雖然不是未定義,但不一定會是你想要的。因為 unsigned 的可能沒有 大到可以原封不動的把值存起來(無號整數隱含取模數)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39 ※ 編輯: Favonia 來自: 140.112.30.39 (08/20 23:03)
firejox:我只能說你太悲觀了... 08/21 22:37
可能吧... 不過這裡用 uintN_t 我覺得沒損失啊 lol
james732:看Favonia的文章會讓我覺得我根本不懂C...orz 08/21 22:43
tropical72:同樓上, 我把 resume 收回來好了 orz... 08/21 22:51
※ 編輯: Favonia 來自: 140.112.30.39 (08/22 04:57)
littleshan:看 Favonia 的文章都覺得他是在婊 standard 08/22 16:40
firejox:我倒覺得是標準狂熱者XDD 08/22 17:19
james732:不過我真的有開了眼界,有些我以為的C語言只是實作剛好 08/22 17:37
james732:那麼做而已,以前根本不知道... 08/22 17:38
感覺 littleshan 大比較懂我 xD 不過我希望這個能在別地方聊 xD 畢 竟很多狀況下程式設計師沒有選擇程式語言的權力,來這個版的人可能有千 百萬個理由非學 C/C++/Obj-C 不可,所以我覺得嗆這些語言沒啥啥意思... (除了上次有人講設計模式和軟體工程手癢回了一篇文...) 在非學這學這些語言不可的情況下,我覺得我能做的就是把我知道的陷 阱講出來。因為編譯器確實會利用標準所給的特權做各種超越想像的「最佳 化」(而且越來越囂張,像 Linux 之類的被迫叫 gcc 關掉某最佳化),所 以才需要看語言標準,因為那是編譯器永遠不能跨過的底線。然後我不是說 編譯器有錯,因為編譯器若完全尊重程式設計師的意圖,程式很難跑得快, 到時候還是開發編譯器的人被罵;常常很多「編譯器測試」就因為 5% 的速 度改進而判定某編譯器比較「優秀」,殊不知某些速度改進是用什麼代價換 來的。 ※ 編輯: Favonia 來自: 140.112.30.39 (08/22 21:39)
xatier:該不會 Favonia 是 copiler 開發人員吧?XD 08/23 17:59
※ 編輯: Favonia 來自: 140.112.30.39 (08/28 21:05) 最近被別人說服之前擔心的狀況不會發生(一來標準委員會自己也不知 世界上有沒有這種機器,二來如果真的有,看起來他們寧願改標準增加規定 避免危機發生。)所以我想收回之前的話,把模糊地帶當作標準寫作失敗, 而不是語言本身的瑕疵。造成大家困擾真不好意思。 ※ 編輯: Favonia 來自: 140.112.30.39 (08/28 22:05) 整篇重寫。 ※ 編輯: Favonia 來自: 140.112.30.39 (08/28 22:10) ※ 編輯: Favonia 來自: 140.112.30.39 (08/28 22:10)