位運算

知乎論壇的相關討論:https://www.zhihu.com/question/34021773
Swift 運算符:http://www.runoob.com/swift/swift-operators.html
C++ 運算符:http://www.runoob.com/cplusplus/cpp-operators.html


有1000個一模一樣的瓶子,其中有999瓶是普通的水,有一瓶是毒藥。任何喝下毒藥的生物都會在一星期之後死亡。現在,你只有10隻小白鼠和一星期的時間,如何檢驗出那個瓶子裡有毒藥?
https://zhuanlan.zhihu.com/p/24375080
解法思維:3線-8線解碼器


在編寫程式碼中使用位運算的場合:

權限管理、聯合表示多個bool值、狀態壓縮、嵌入式系統內用於設置寄存器、用於檢測或設置各種Flag、底層的編程、Hash演算法、加密、IP位址、顏色轉換、狀態位、UTF字符處理等。

不同位上的1代表不同的意義,讓不同的設置值和諧共存,互不干擾。

有些時候讓程式表達更清晰,比如表示2的n次方時。

遊戲開發,設計怪物屬性,一開始很簡單,後來陸續加入了是否是boss,是否主動攻擊,是否抗眩暈,是否抗沉默等屬性。
一般程序員的做法是狂加字段,然而位運算一個字段就搞定了。
用位运算来叠加和筛选各种状态。

涉及硬體编程时,C语言有位域。


知乎論壇回答里面说位运算符有用的有道理,说用位运算符装B的其实也有道理。因为双方都站在不同的立场上看问题。

位运算符一般是用作flag组合,确实有用,感觉也就是位运算符唯一有用的地方,其他方面的应用都有替代性了。

而说位运算符装B也确实有道理,因为用位运算符能提高运行效率,但是增加了可读性的难度和维护的成本。我记得公司摊派了个任务,维护很久以前离职员工用C++写的一个游戏大厅联网的俄罗斯方块。因为策划提出新的需求和需要解决历史遗留下来的BUG,我发现核心代码是一段二维数组和穿插着大量对这个二维数组进行操作的位运算符,包括行方块的消除,行方块的下移等等操作。看懂是没问题,但是耗费了我大量的时间。然后我在这个基础上增加了新功能,比如道具对行方块的上移,方块的投影等等,出现大量的新BUG。然后发email给那个离职程序员看,他说他五年前写的,现在也忘记了没精力去分析解释给我看。我一气之下重写了核心部分,浪费了我好几天时间。我从来不去指责别人写的代码好坏,因为每一段代码的产生都可能背后都有故事,但是我想说用位运算符的同学做人留一线日后好相见。


C艹有bitset,其实就是位运算的封装,不过可读性更佳


位运算在嵌入式系统的编程中,有很广泛的应用。无论是在底层控制IO口的电平,还是在应用层面设置某个状态变量的特定位状态,又或者是在通信接口的软件设计中,都是经常使用的。熟练的运用位运算的技巧,是嵌入式软件工程师的必备技能。


接手的项目要和别的设备通讯,协议是自定义的,比如前两个字节是命令,第三个字节是包序号第四个字节和第五个字节的前四位是设备型号,第五个字节的后四位是设备识别码。取前四位比较容易,直接data[4] / 16就可以,后四位想了好久都没想明白怎么取。就差用if...else判断了。直到我在项目里看到了一句  (data[4] & 0xF0)>> 4




程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...