2011-05-23 71 views
5

我想找到一些書籍或資源詳細談論比特,以便例如我可以將數字(如16)轉換爲比特。我現在是一名高中生,每當閱讀一本編程書時,我幾乎可以理解除了位/按位運算符部分之外的所有內容。我只是不知道它是如何工作的,爲什麼人們發明位& byte :(因此,我希望你們可以給我一些資源建議,談論如何將數字/字符轉換爲位。回答我的問題,有一個偉大的一天!在哪裏瞭解「位」?

+3

計算機系統,程序員的視角。 – wliao 2011-05-23 02:12:53

回答

8

嘗試使用谷歌搜索'二進制算術'。這裏有一個pretty good article讓你開始。

+0

謝謝皮特!我忘了維基百科... :) – phongvcao 2011-05-23 02:14:31

3

他們之間沒有什麼區別,因爲我不覺得他們可以比擬的。有點被「發明」,因爲電腦只知道兩種狀態,在(1)或關閉(0)。一個字節只有8位,我不知道任何書是專門討論一個字節或字節的,但如果你看看有關邏輯設計,數字基礎知識或任何有關硬件架構的書籍,會發現更多關於位的信息以及它們是如何使用的。彙編語言也可以處理h位遠遠高於更高級別的語言,因此您可能還需要考慮這一點。

+0

感謝您提供我已經編輯過的問題的快速回復!你有任何細節解釋比特?例如如何將數字轉換爲位... – phongvcao 2011-05-23 02:08:40

+3

「現代商品系統」上的字節是8位。它並不總是如此:) – 2011-05-23 02:08:50

+0

@phngcv我編輯了我的答案,提供了一些更多的建議。我沒有完全理解比特,我自己或者一切都很好。直到我在大學進行邏輯設計課程。我提出了一些建議,以便您可以更輕鬆地找到所需的深入信息。 – Pete 2011-05-23 02:11:59

5

你的問題是不相關的編碼或任何特定的編程語言,但更多的數學,escpecially代數和數字系統。然後,下一步將是處理器x86架構基礎知識,比您可以使用編程語言。

BTW:通常大約爲病毒x86的書是非常好的開端理解CPU是如何工作的,但沒有understandign基地-2和16爲基的系統,你不會從他們那裏得到很多。

+0

一本關於計算機病毒的書可能是學習編程基礎知識的最糟糕的方法之一。 – 2011-05-23 07:35:56

+1

「通常有關x86病毒的書籍非常好,開始瞭解CPU如何工作」 - 請閱讀並理解。 我還沒有看到許多關於寄存器,位級處理等的編程語言書籍,而CPU架構指南通常對於新手來說非常複雜。 如果他想寫我的第一個Hello World - 繼續從書架上取下這本書,但是如果他對基礎知識更加感興趣,那麼我強烈推薦病毒的方式:) – Random 2011-05-23 08:16:48

1

要回答你的問題的一部分...

在谷歌搜索框中只需鍵入16 to binary。如果你感覺真的很勇敢,你可以輸入16 to hex以十六進制得到你的答案。 :)

+0

你真棒Chris! :) – phongvcao 2011-05-23 02:15:49

+1

很高興幫助:)雖然與nary一個upvote, -/ – 2011-05-23 02:47:22

2

不太一本書,但Wikipedia article on Binary representations of numbers進入過多的細節。關於converting between bases有一個很好的部分,你可能會覺得有用。

There are some scary clever tricks to working with bitfields and binary representations of numbers;來自stb.h header

int stb_bitcount(unsigned int a) 
{ 
    a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 
    a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 
    a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits 
    a = (a + (a >> 8)); // max 16 per 8 bits 
    a = (a + (a >> 16)); // max 32 per 8 bits 
    return a & 0xff; 
} 

unsigned int stb_bitreverse8(unsigned char n) 
{ 
    n = ((n & 0xAA) >> 1) + ((n & 0x55) << 1); 
    n = ((n & 0xCC) >> 2) + ((n & 0x33) << 2); 
    return (unsigned char) ((n >> 4) + (n << 4)); 
} 

unsigned int stb_bitreverse(unsigned int n) 
{ 
    n = ((n & 0xAAAAAAAA) >> 1) | ((n & 0x55555555) << 1); 
    n = ((n & 0xCCCCCCCC) >> 2) | ((n & 0x33333333) << 2); 
    n = ((n & 0xF0F0F0F0) >> 4) | ((n & 0x0F0F0F0F) << 4); 
    n = ((n & 0xFF00FF00) >> 8) | ((n & 0x00FF00FF) << 8); 
    return (n >> 16) | (n << 16); 
} 

簡直太神奇了。 :)

+1

看起來像我今晚會頭痛...... :( – phongvcao 2011-05-23 02:16:26

5

http://en.wikiversity.org/wiki/Bitwise_operators

http://en.wikipedia.org/wiki/Binary_numbers

一旦你學會了如何表示基2(二進制或 「位」)號,位運算符是非常簡單易懂。

我只是舉一些簡單的例子:

令m = 31532 = 111101100101100和n = 12325 = 11000000100101。

然後正&米(按位與 - 二進制運算符)的結果爲:

(如果n(i)和M(1)都爲1,則結果爲1,否則爲0)

111101100101100 
011000000100101 
=============== 
011000000100100 

n的結果|米(按位或 - 二進制運算符)爲:

(如果n(i)和M(i)爲0,則結果爲0,否則爲1)

111101100101100 
011000000100101 
=============== 
111101100101101 

的n個^ M的結果(按位異或 - 二進制運算符)爲:

(如果是n(i)和M(i)爲1,但不能同時,則結果爲1,否則爲0)

111101100101100 
011000000100101 
=============== 
100101100001001 

的〜n(按位非 - 一元運算符)的結果是:

(如果n(I)= 1,則結果爲0,否則爲1)

111101100101100 
=============== 
000010011010011 

設K = 3,k的N >>結果(逐位向右移位)是:

111101100101100 
=============== 
000111101100101 

他們只是向右k = 3次轉移。這有效地將數字除以2^k = 8。它通常被編譯器用作優化。

反之,令k = 3,N < < K(按位左移位)的結果是

111101100101100 
=============== 
101100101100000 

他們根本沒有向左K = 3次移位。這有效地將數字乘以2^k = 8。有一點需要注意,因爲32位整數只能保持2^32-1,出現算術溢出,即高位k位被截斷。

你只需要仔細看看這些,並找出這些模式。

它們在編程中很重要,因爲它們通常用於設置/清除標誌值。

因爲INT32有32個二進制數字,它可以包含高達32個不同的種布爾標誌(或者0表示否,或1表示是)

我認爲這是它。他們相當直觀。

0

我建議學習編程一個z80,PIC或其他微處理器。然後你就會明白位和字節來自哪裏。但是,在你這樣做之前,你可能想用數字電子設備弄髒。存在的原因是因爲數字電子設備僅具有2個值的信號,即打開和關閉,因此1和0或一位。

2

我讀過的關於二進制數學和位移的最好的書之一是Hacker's Delight.它實際上是關於任何與超優化有關的書。我強烈建議閱讀,如果材料太複雜,請慢慢閱讀。我不得不重寫像strlen()這樣的標準庫函數以用於業餘愛好操作系統,而這本書拯救了我的生活。

+0

超優化是枚舉代碼序列以找到最佳的技術計算一個期望的結果(http://en.wikipedia.org/wiki/Superoptimization)。這與Hacker的Delight無關,它是關於使用數學和邏輯來獲得各種計算的優秀算法,而不會愚蠢地列舉所有代碼序列。 – 2014-02-22 20:38:14

1

計算機世界中的所有東西都可以用'0'&'1'字符串表示。例如,一個int類型的普通類型有32位,long long類型有64位,n位類型可以表示從0到2^n-1的數字。另外,比如「< <」,「>>」,「&」或「|」比計算機中的算術運算更快,因爲它使用硬件來執行此操作。並且許多代碼可以根據這個進行優化。

將int轉換爲二進制,首先您應該知道的是,任何數字都可以用2^0,2^1,2^2 .... 2^k組合來表示:like 6 = 2^2 + 2^1,13 = 2^3 + 2^2 + 2^0等等,那麼6和13可以寫成0110和1101.事實上,這是一個數學問題。

如果您想了解有關位操作的更多信息,我認爲您可以在Google或wiki上進行搜索,而不是在這裏搜索。