2009-06-23 11 views
3

雖然我知道二進制表示的基本概念,但我從來沒有真正寫過任何使用二進制算術和運算的代碼。程序員應該瞭解二進制數和算術的絕對最小值是多少?

我想知道

  • 哪些基本概念,任何 程序員應該知道二進制 數字和算術? ,並且

  • 在編程中可以使用二進制 操作的「實用」方式。 I 已經看到一些「酷」的使用 運營商和異或等,但有 一些典型的問題,其中使用二進制 操作是一個明顯的選擇。

請指點一些很好的參考資料。

+2

男人,時代的變化。在我的頭上有4個紅色LED。當我看到一個數字或字母a到f時,正確的燈光就會發光。 – Nosredna 2009-06-23 03:42:27

+0

你應該能夠數到一百萬,然後回到二進制中...... OMG,這個問題(和答案)是一個笑話嗎?今天是4月1日? – TFM 2009-06-23 05:31:24

+3

世界上有10種人,那些懂得二進制的人,那些不懂的人。 – 2009-06-23 05:32:12

回答

6

如果您正在開發低級代碼,理解各種類型的二進制表示是至關重要的。如果您正在開發嵌入式應用程序,或者您正在處理低級傳輸或存儲數據,那麼您會發現這非常有用。即使你在更高級別的抽象層次工作,我也相信理解事情如何在低級別工作是有用的。例如,我發現,通過了解事物如何在低層次上表現和操縱,我提高了開發高效代碼的能力。我也發現這種理解對於使用調試器很有用。

這裏是二進制表示的主題進行研究的短名單:

  • 編號系統(二進制,十六進制,八進制,十進制,...)
  • 二進制數據組織(位,半字節,字節,也就是說,...)
  • 二進制算術
  • 其他二進制運算(AND,OR,XOR,NOT,SHL,SHR,ROL,ROR,...)
  • 類型的代表(布爾,整數,浮點數,struct,...)
  • 位字段和打包數據

最後......這裏有一組不錯的Bit Twiddling Hacks你可能會覺得有用。

3

我相信在二進制運算線AND,OR,XOR基本知識怎麼樣了,是否會被派上用場,因爲大多數編程語言中的逐位形式支持這些操作運營商。

這些操作也用於圖像處理和圖形中的其他區域。

我能想到的異或操作的一個重要用途是奇偶校驗。勾選此http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/xor.html

歡呼

1

這真的取決於你所使用的語言。最近的語言(如C#和Java)會從您那裏抽象出二進制表示形式 - 這使得使用二進制文件變得困難,而且通常不是用這些語言來完成任何事情的最佳方式。

然而,像C和C++這樣的中低級語言要求你理解數字如何存儲在底下 - 特別是關於字節順序。

當實現某種類型的跨平臺協議時,二進制知識也很有用....例如,在x86機器上,字節順序是小端的。但大多數網絡協議都需要大端數字。因此,你必須意識到你需要做的轉換,順利進行的事情。許多RFC,例如這個 - >http://tools.ietf.org/html/rfc4648需要二進制知識才能理解。

總之,它完全取決於你想要做的事情。

Billy3

0

它的方便知道號碼256和65536這是很方便的知道如何補負數的工作。

也許你不會碰到很多二進制文件。我仍然經常使用它,但也許出於習慣。

對按位操作的熟悉應該讓你更容易用布爾代數,我認爲這對每一位程序員都很重要 - 你希望能夠快速簡化複雜的邏輯表達式。

2

你沒有具體提及(也不排除 - !)浮點二進制數字和算術,所以我不會錯過機會,鞭打我最喜歡的articles曾經一個(嚴重:有時我真希望我能通過一個嚴格的測驗它作爲一個程序員工作的前要求... ;-)。

3

下面的事情我經常欣賞知道我很傳統的編程工作:

  • 知道2的冪達到2^16,要知道2^32是約4.3十億。瞭解它們,以便如果你看到第2147204921號彈出某處,你的第一個想法是「嗯,看起來非常接近2^31」 - 這是一個非常有效的bug雷達模塊。

  • 能夠做簡單的算術;例如將十六進制數字轉換爲nybble並返回。

  • 對浮點數如何用二進制表示有一些模糊的想法。

  • 瞭解在其他人的代碼中可能會遇到的標準約定,這些代碼與位混合有關(標誌將OR組合在一起以創建複合值,AND將檢查自己的集合,移位運算符將數字打包並解包爲不同字節,你會得到相同的東西,那種事情。)

進一步的知識主要是肉汁,除非你工作與顯着的性能限制或做其他不太常見的工作。

3

在絕對最低限度你應該能夠實現一個位掩碼的解決方案。與位掩碼操作相關的任務應該確保你至少能夠理解二進制文件。

2

每個程序員都應該知道的二進制數字和算術,最重要的是:在計算機每個數字在某種二進制編碼的表示,並在計算機上的所有運算是二進制算術。

這樣做的後果是多方面的:

  • 浮點「錯誤」與IEEE浮點二進制數做數學的時候(這是所有數字在JavaScript中,相當在JAVA幾下,C)
  • 表示數的上限和下限爲每種類型
  • 乘法/除法/平方根等操作(的性能成本爲嵌入式系統
  • 精度損失,和累積誤差

以及更多。即使你從來沒有做過一點點xor,或者不是,或者你生活中的任何事情,這也是你需要知道的東西。你仍然會遇到這些事情。

0

絕對最小值是,「2」是不是二進制數字和10b是小於3

3

從我的頭頂,這裏有,我已經使用位運算符做有用的一些例子東東。

一段JavaScript在需要的那些「檢查所有」框之一是沿着這些路線的東西:

var check = true; 
for(var i = 0; i < elements.length; i++) 
    check &= elements[i].checked; 
checkAll.checked = check; 

計算立方體的角點。

Vec3f m_Corners[8]; 

void corners(float a_Size){ 
    for(size_t i = 0; i < 8; i++){ 
     m_Corners[i] = a_Size * Vec3f(axis(i, Vec3f::X), axis(i, Vec3f::Y), axis(i, Vec3f::Z)); 
    } 
} 

float axis(size_t a_Corner, int a_Axis) const{ 
    return ((a_Corner >> a_Axis) & 1) == 1 
     ? -.5f 
     : +.5f; 
} 

繪製謝爾賓斯基三角形

for(int y = 0; y < 512; y++) 
    for(int x = 0; x < 512; x++) 
    if(x & y) pixels[x + y * w] = someColor; 
    else pixels[x + y * w] = someOtherColor; 

發現兩個

int next = 1 << ((int)(log(number)/log(2)); 

下一個電源判斷一個數是兩個

bool powerOfTwo = number & (number - 1); 

列表可以電源繼續前進,但是我這些都是(除了Sierpinksi)日常的例子。一旦你理解並使用它,你會在越來越多的地方遇到它,例如立方體的角落。

0

如果你從來沒有這樣做(在嵌入式系統,如C)低級編程,從來沒有使用調試器,並且永遠不會有實數的工作,那麼我想你可以不知道二進制度日。但瞭解二進制將使你成爲一個更強大的程序員,即使是間接的。

一旦你冒險進入你所需要知道的二進制領域(及其``妹'基地,十六進制)。不知道它:

  • 嵌入式系統編程將是不可能的。

  • 調試會很難,因爲你不知道你在內存中看什麼。

  • 帶小數的數值計算會給你你不明白的答案。

4

您必須瞭解位掩碼。

許多語言和情況都需要使用位掩碼,例如參數或配置中的標誌。

PHP有你有位掩碼控制其錯誤級別:

error_reporting = E_ALL & ~E_NOTICE 

或者乾脆檢查,如果一個int是奇數還是偶數:

isOdd = myInt & 1 
0

我學會了玩弄位回來時,c和asm仍然被用於「主流」編程。雖然我不再用這些知識,但我最近用它來解決現實世界的業務問題。

我們使用傳真服務,在傳真重新發送x次後發送或失敗時,將消息發回給我們。我必須確定傳真的唯一途徑是15個字符的字段。我們希望將其整合到所有客戶的一個URL中。在我們整理之前,我們所需要的就是我們剛剛以字符串形式發送的FaxID PK(32位整數)列。

現在我們必須在客戶端下面標識客戶端(4個字符的代碼)和數據庫(32位int)。我能夠使用base 64編碼來做到這一點。如果不理解數字和字符的二進制表示,我可能永遠不會想到這個解決方案。

0

有關數字系統的一些有用信息。

Binary | base 2

十六進制|基數16

小數| base 10

Octal | base 8

這些是最常見的。

轉換它們非常簡單。

112基座8 =(1×8^2)+(2×8^1)+(4×8^0)

74基座10 =(7×10^1)+(4× 10^0)

AND,OR,XOR等用於邏輯門。搜索布爾代數,非常值得知道的時間。

舉例說,你有11001111的基數2,並且你只想提取最後四個數。對於

真值表:

 
P | Q | R 
T | T | T 
T | F | F 
F | F | F 
F | T | F 

您可以使用11001111基地2和00111111基地2 = 00001111基地2

有很多資源在互聯網上。

相關問題