學編程的時候都會先學進位轉換,請問在實際編程過程中,這些東西有用么?
編程的基礎課程都會有進位轉換方面的教學。2進位、8進位、10進位、16進位。請問在實際的編程過程中(編寫實際的程序、應用之類,排除在校期間的學習和考試,還有編寫進位轉換器程序),這些進位轉換的知識有用么?如果有,又是在什麼時候,產生什麼樣的作用呢?謝謝!
計數效率秒殺別人。
Source: 如果從小隻學二進位會怎麼樣? - 匿名用戶的回答
16進位特別有用,搞C++的時候可以口算兩個指針的距離,這個技能簡直無法不學。
嵌入式開發,2進位16進位互轉是必須心算的,不然配個寄存器還總去開calc,略low啊至於和10進位的互轉,好像主要是用於估算。
當然有用。任何一門語言用到bit flag和比特位運算的時候都會涉及到2進位轉10進位/16進位的心算。起碼你得知道十進位7=二進位111,或者0xFF = 二進位1111 1111
那是智力測試,你沒見都放在書的第一章么。意思就是你連個二進位轉換都做不了,也就別浪費時間往下學了。
啰嗦一回,舉個例子:
假設你做了個什麼財務軟體的許可權管理,就是用戶和角色之間的1:N映射關係,你怎麼存儲?角色:1. 管理員 2. 出納員 3. 會計 4. 財務經理 5. 總經理
假設用戶zhangsan身兼數職,既是管理員(1)又是財務經理(4)還是總經理(5)通常是用一張表來存賬號和角色之間的映射關係,User Role
1 11 41 5
假若用戶角色變了,需要insert, delete, update這個表。
其實,如果你掌握了二進位的話,還可以這麼存:User Roles (int)
1 50
50的二進位碼是「000110010」,用戶許可權變了之後做位或、位與就行了,一條update就搞定。
幾乎所有的編程語言都有( | !)這3個位運算符,而要會用這幾個運算符就繞不開2進位,在之前的10年里,PC大都是32位的,32個1和0組成一個數太長了(0b10101010101010101010101010101010),所以要教16進位(0xaaaaaaaa),2進位,16進位都有了,也不差個8進位,也就順帶教給學生們了。至於用處嘛,大大的有。單片機,嵌入式的都要用到。不會是不可能的。在Linux下umask命令必須要懂8進位吧。抓包分析網路協議時要用到,比如一個包頭中有一個位元組是0x86,換成2進位就是0x1000 0110,每一(幾)位都有不同的意義。還有網路地址的子網掩碼不能亂填的,學網路的至少要知道255.255.255.0代表了什麼吧。想到了再補充。
學編程最尷尬的不是不會,而是根本不知道有這個東西,你看了一眼知道了有這麼個東西,需要用的時候再回去看就好了
其實沒啥用了,
什麼標誌位啥,現在不用這麼小氣這點內存。不過知道總比不知道好,不然你看不懂老代碼就麻煩了演算法設計中狀態壓縮 可能會用二進位 三進位 四進位...
位運算啊。
判斷一個數X是不是2的N次冪。常規的方法肯定是用循環,但是如果略微熟悉整型的二進位存儲,使用一下C++的移位運算符:return !(X(X-1));
一行代碼,so easy!我雖然不是參加ACM競賽的,但是直觀感覺移位運算耗時是低於for循環運算的。如果將來從事硬體工作,肯定是要經常使用這種寄存器級別(我發明的概念)的編程的!
難道你沒覺得這樣寫程序很酷嗎?再舉個例子:
如何在不引入第三個變數的前提下交換兩個數值?這個是之前一個在百度的學長說的某互聯網企業(去哪兒網?)的面試題,據說很多人跪。這個也是異或運算就好啦!x=x^y;
y=x^y;
x=x^y;
當然了,也不只是只有這一種方法,簡單的加減運算也能實現。但是我就是覺得寄存器級別的運算快啊~
如果你不懂進位轉換,我想^、&<&<、&>&>、之類的運算符是很困難理解的,而大部分(額我接觸過的主流的C++,java)都包含這種位操作的啊,所以和編程真的關係很大很大!
當然了,如果你學習密碼學方向的內容,不懂二進位和二的四次方進位,那麼你也就理解個凱撒密碼了。DES、AES這些傳統的密碼術很多步驟都是需要二進位和十六進位數實現的。而涉及到RSA這種密碼,現在高效的破譯訪法也是基於二進位位運算的。
額,上學期現代密碼學我只考了六十分,就不在這班門弄斧了。一個十位數的因式分解我考試的時候挨個湊,人家學霸徒手操作簡單的位運算就解決了,我簡直哭瞎!
綜上所述,因為二進位是計算機的語言,所以很多時候,使用運算是很方便甚至是最優(最快)的解決方案。而進位轉換本身是很簡單的事情,這個我弟弟初二一學生都能學會。說實話,如果這個都學不會,那能寫什麼代碼?估計也就hello world了吧。
以上:位運算很快!
然後就是計數效率還有 @vczh所說的指針距離,我就不做贅述了。調試的時候口算各種標誌位。
網路配子網路由,算掩碼會用到256以下二進位10進位轉換。詳細參考 ccna內容
直到有一天像我吧 要做一個app控制電視機 面對大量的16進位的數據 要全部轉換為二進位 去控制 不學 你的問題就來了 因為不僅僅是轉化 還有很多異或操作 當然這些知識很簡單 但學了總比沒學好吧
嵌入式開發!調試的時候看到特殊的十六進位或者二進位數,會很快定位錯誤!
其他的諸如:
查看寄存器操作寄存器某些位,計算存儲器地址位操作什麼的。。。算是技能樹上一支花吧!你寫通信協議就知道了,有時候就得逐位元組逐位的驗證,沒有16進位的報文咋整?說到八進位,不得不提unix的文件屬性,天才的設計。
如果你不知道二進位你就不能理解位移,就不能理解unicode編碼,不能理解各種編碼格式是怎麼一回事,不能理解為什麼中文是兩個位元組,話說回來,如果連二進位都不理解,還能叫程序猿?
有用,16進位2進位是有用的.各種顏色都是十六進位的。二進位的作標誌位之類的。都用的很多。
額,怎麼說呢?
如果你去美國,你打算不說英語么?
除了你是外交官。十六進位,八進位,其實說到底都是二進位的簡記法,寫程序的人,你不用計算機的思維方式思考,那你就慘了。
不過這個也和具體的語言和領域有關,如果你不幹的儘是一些基於字元流的東西,又比較少涉及不同數據類型轉換,誰她媽沒事研究這個推薦閱讀:
※為什麼google編程風格指南設置縮進為2個空格?
※UML 還有用嗎?
※關於內存地址和顯存地址?
※C 語言是學編程的基礎嗎?
※在編程過程中boolean變數一般怎麼命名?
TAG:編程 |