十進位制一直是我心中過不去的一道坎。。
人類社會使用十進位制已經幾十萬年的歷史了,追根到底它源於遠古智人的手指計數:當十隻手指記不下時就會找其他記號標記乙個「十」,接著從1開始再次用手指記錄,以此迴圈。當十根可愛的手指頭在眼前不停晃動,重複最末位的計數,人們也慢慢習慣上了這種進製方式,代代相傳。
可不幸的是,現代計算機和二進位制密不可分。無論是記憶體位址,硬碟資料,匯流排訊號還是無線電磁波,都遵循著二進位制排列組合的規則。因為種種原因,兩級對立的普遍性和穩定性存在於這個物質世界的許多地方:電晶體的開與關(記憶體),電磁的正與負(機械硬碟),電訊號的有與無(資料線),波頻的高與低(無線網路)。
十進位制與二進位制相距甚遠,且不是次方關係,這直接造成了許多問題,首當其衝的就是:符號匱乏的二進位制想要表示乙個檔案需要排列組合很長很長一串,最重要的是十進位制二進位制之間的轉換比較麻煩。
隨著大腦進化,人類早就脫離了用手指來記10以下的數量,直接大腦快取即可,事實上人腦可以輕鬆駕馭遠大於10的進製計算。只是基因和社會化的緣故,導致我們仍然依賴於十進位制。
這些窘境該如何解決呢?在這裡有乙個「不成熟」的方案藍圖:不改變計算機而去改變人類自己,讓人類使用16進製制!
正如之前所說,兩極性的普遍實用讓二進位制和十進位制「相愛相殺」,因為兩極之間的穩定性和快速切換性無處不在,就像語言學中「正反大小高低強弱」這些普遍支援的衡量概念。計算機歷史上曾經有人想挑戰這一「盛世哲學」但均無功而返:第一代美**用計算機利用高能耗的電子管cpu試圖實現十進位制計算來與人類同步;俄羅斯曾經提出的三進製創想最終化為泡沫。對計算機進製的爭議最終還是收斂到無可比擬的二進位制。
為什麼人類使用16進製制會更好呢?這裡有兩點原因,第一點原因是為了適應計算機。
先來說下計算器核心部件的工作邏輯:
當你從輸入裝置上依次寫入十進位制數的每一位之後(注意此時記憶體中是乙個用二進位制表示每一位的十進位制數),cpu通過演算法將它們轉化成乙個完整的二進位制數(通常分配乙個4位元組的空間用於儲存)。之後就開始了二進位制數之間的數值運算,也就是經典的邏輯運算實現加減法,加減組成乘除,算出結果後再通過乙個二轉十進位制的演算法輸出。
邏輯電路
在這個過程中,十與二進位制之間的轉換計算所消耗的時間要遠大於單純的兩個數之間的四則運算,這就是存在的「不合理」之處。
為解決這個矛盾,聰明的程式猿們提出了模擬豎式計算的「十進位制演算法」,這種辦法直接繞過了數制轉換。在記憶體或快取中,數是直接以十進位制的形式存放的,最終通過每一位十進位制數字之間的二進位制計算,同時模仿十進位制的進製規則,最終得到的結果自然也是十進位制的。這種演算法還突破了4byte儲存的限制,讓計算更靈活。
but,仿豎式計算的致命缺陷仍然在儲存上,因為至少要用乙個位元組來儲存位數字,可惜乙個位元組可以表示256個不同數字,運用在十進位制上面顯然很浪費,即使只用4個位元也也會損失一半以上的資源浪費。可想而知,這種演算法只適用於「連續計算但不連續輸出」的情況,儲存時還得轉成二進位制,再加上浮點數的負數的限制讓這種演算法難以大規模使用。
大整數豎式乘法的核心演算法
說來說去,矛盾的核心還是停留在進製的轉換問題上。這時請呼叫我們靈活的大腦,發揮想象,順便回到主題「16進製制」。眾所周知2進製轉16進製制是相當簡便與直接的:乙個16進製制數字與4位二進位制數一一對應,即實現了空間充分利用又大大降低了轉換的成本,直接加快了osi參考模型中「應用層」的執行速度,簡直是完美。如果人類從一開始就使用十六進製制生活工作,到20世紀伊始又邂逅了可愛的圖靈計算機,那麼此時的我們將多麼受益啊!
還有,人類最好使用16進製制的第二點原因是:有助於人類自己。十進位制對於我們的大腦的計算和記憶能力來說過於簡單容易了,16進製制更豐富的表示能力可以讓人們的生活潛移默化地趨向多樣化,滲透到我們的語言和文化的種種方面,激發大腦的智力,提公升大腦的思考。雖然聽起來很抽象,卻是個不爭的事實,只可惜人類進化史讓我們沒能長處8根指頭,不然這個世界會是個全新的面貌哦。
所以請容許我提出乙個目前看似無法實現的夢想,就是「全民改用16進製制」。此願望若是成真,將是多麼大的乙個進步啊。可見社會固化並不全是好處,正確的變革還是由少數人完成的哈,也許未來會有越來越多人意識到這一條可持續發展的新方向。
使用16進製制顏色值
通常情況下我們是直接使用類似於 ee1289這樣的 來直接表示rgb顏色的 uicolor colorwithred 0xee 255.0 green 0x12 255.0 blue 0x89 255.0 alpha 1 這樣呼叫真是太繁瑣了,所以封裝了乙個小方法來直接呼叫 獲取顏色 uicolor...
16進製制位址進製
16進製制 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 乙個位址表示乙個byte,即8bit 0x8000000033221100 77665544 bbaa9988 ffeeddcc 0x8000001076543210 0x80000000 00000000 0x80000001...
UIColor的16進製制色值,16進製制字串擴充套件
inte ce uicolor hex 16進製制字串轉化為顏色 param hexstr 16進製制字串 支援 0x.0x.return uicolor uicolor colorwithhexstring nsstring hexstr 16進製制字串轉化為顏色 param hexstr 16進...