Bitwise Operators. July 21, 2021. 1 分鐘. 以前覺得位元邏輯操作很難記,但昨天仔細看了一下後突然了解到之前沒有特別去理解 0 和 1 代表的意思而是用死背的方式, ... ... <看更多>
bitwise意思 在 Re: [閒聊] 真的有扯到... | PTT 熱門文章Hito 的推薦與評價
Bitwise or 什麼意思? 就是要把二個數用二進位位元的處理方式求值. 如果這時候short-circuit evaluation進來,意思反而亂了. 意思會變成在某些時候,你弄個A | B, ... ... <看更多>
bitwise意思 在 Re: [問題] 關於bitwise的問題- 看板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:https://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)
※ 編輯: Favonia 來自: 140.112.30.39 (08/22 04:57)
竟很多狀況下程式設計師沒有選擇程式語言的權力,來這個版的人可能有千
百萬個理由非學 C/C++/Obj-C 不可,所以我覺得嗆這些語言沒啥啥意思...
(除了上次有人講設計模式和軟體工程手癢回了一篇文...)
在非學這學這些語言不可的情況下,我覺得我能做的就是把我知道的陷
阱講出來。因為編譯器確實會利用標準所給的特權做各種超越想像的「最佳
化」(而且越來越囂張,像 Linux 之類的被迫叫 gcc 關掉某最佳化),所
以才需要看語言標準,因為那是編譯器永遠不能跨過的底線。然後我不是說
編譯器有錯,因為編譯器若完全尊重程式設計師的意圖,程式很難跑得快,
到時候還是開發編譯器的人被罵;常常很多「編譯器測試」就因為 5% 的速
度改進而判定某編譯器比較「優秀」,殊不知某些速度改進是用什麼代價換
來的。
※ 編輯: Favonia 來自: 140.112.30.39 (08/22 21:39)
最近被別人說服之前擔心的狀況不會發生(一來標準委員會自己也不知
世界上有沒有這種機器,二來如果真的有,看起來他們寧願改標準增加規定
避免危機發生。)所以我想收回之前的話,把模糊地帶當作標準寫作失敗,
而不是語言本身的瑕疵。造成大家困擾真不好意思。
※ 編輯: 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)
... <看更多>