Re: [問題] 關於bitwise的問題

看板C_and_CPP (C/C++)作者 (小西風最乖了*^^*)時間14年前 (2011/08/20 22:55), 編輯推噓2(206)
留言8則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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)

08/21 22:37, , 1F
我只能說你太悲觀了...
08/21 22:37, 1F
可能吧... 不過這裡用 uintN_t 我覺得沒損失啊 lol

08/21 22:43, , 2F
看Favonia的文章會讓我覺得我根本不懂C...orz
08/21 22:43, 2F

08/21 22:51, , 3F
同樓上, 我把 resume 收回來好了 orz...
08/21 22:51, 3F
※ 編輯: Favonia 來自: 140.112.30.39 (08/22 04:57)

08/22 16:40, , 4F
看 Favonia 的文章都覺得他是在婊 standard
08/22 16:40, 4F

08/22 17:19, , 5F
我倒覺得是標準狂熱者XDD
08/22 17:19, 5F

08/22 17:37, , 6F
不過我真的有開了眼界,有些我以為的C語言只是實作剛好
08/22 17:37, 6F

08/22 17:38, , 7F
那麼做而已,以前根本不知道...
08/22 17:38, 7F
感覺 littleshan 大比較懂我 xD 不過我希望這個能在別地方聊 xD 畢 竟很多狀況下程式設計師沒有選擇程式語言的權力,來這個版的人可能有千 百萬個理由非學 C/C++/Obj-C 不可,所以我覺得嗆這些語言沒啥啥意思... (除了上次有人講設計模式和軟體工程手癢回了一篇文...) 在非學這學這些語言不可的情況下,我覺得我能做的就是把我知道的陷 阱講出來。因為編譯器確實會利用標準所給的特權做各種超越想像的「最佳 化」(而且越來越囂張,像 Linux 之類的被迫叫 gcc 關掉某最佳化),所 以才需要看語言標準,因為那是編譯器永遠不能跨過的底線。然後我不是說 編譯器有錯,因為編譯器若完全尊重程式設計師的意圖,程式很難跑得快, 到時候還是開發編譯器的人被罵;常常很多「編譯器測試」就因為 5% 的速 度改進而判定某編譯器比較「優秀」,殊不知某些速度改進是用什麼代價換 來的。 ※ 編輯: Favonia 來自: 140.112.30.39 (08/22 21:39)

08/23 17:59, , 8F
該不會 Favonia 是 copiler 開發人員吧?XD
08/23 17:59, 8F
※ 編輯: 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)
文章代碼(AID): #1EJyhPy7 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1EJyhPy7 (C_and_CPP)