簡體   English   中英

K&R C 第2章賦值運算符和表達式

[英]K&R C chapter 2 assignment operators and expressions

賦值運算符不是我期望的。 到目前為止,本節中的所有內容都很熟悉,但他們解釋它的方式使它看起來很陌生。 我認為這是我感到困惑的按位運算符。

無論如何,這是我沒有得到的部分。

bitcount計數計算其 integer 參數中 1 位的數量。

 /*bitcount: count 1 bits in x */ int bitcount (unsigned x) { int b; for(b=0; x;= 0; x >>= 1) { if(x & 01) b++; return b; }

將參數x聲明為無符號可確保當它右移時,空出的位將用零填充,而不是符號位,無論程序運行在什么機器上。

並不是說我真的理解代碼,但最后一句話最讓我困惑。 這是什么意思? 它是否通過“符號位”表示“一個”,這是否與二進制補碼有關?

我真的很難通過按位運算。 誰能推薦一些全面的材料來補充本書中的按位內容?

假設x是二進制補碼。 為了說明,讓我們使用八位寬度。 (C 總是以更寬的寬度移動,至少是int的寬度。)

如果x是 64 (01000000 2 ),我們將它右移一位,我們得到 32 (00100000 2 )。 當我們重復此操作時,我們得到 16 (00010000 2 )、8 (00001000 2 )、4 (00000100 2 )、2 (00000010 2 ) 和 1 (00000001 2 )。

x為 -64 時,二進制補碼用 11000000 2表示。 如果我們將其右移並帶入 0 位,則這些位為 01100000 2 ,表示 64+32 = 96。所以 -64 變為 96。現在,如果只使用位,那可能沒問題。 但是,如果我們想使用位移來除數,我們需要 -32,而不是 96。-32 的位是 11100000 2 所以我們可以通過引入 1 位而不是 0 位來實現。 -16 的位是 11110000 2 那么-8、-4、-2和-1是11111000 2 、11111100 2 、11111110 2 、11111111 2 在每種情況下,我們在移位時都會帶入 1 位。

因此,如果我們想使用移位進行除法,則有一個簡單的移位規則:將所有位右移一位,並將符號位保持原樣(0 或 1)。 如果我們移動不止一位,請繼續復制符號位。

這稱為算術右移。 因此,我們有兩種右移:一種是復制符號位的算術右移,另一種是帶入 0 位的邏輯右移。

對於無符號類型,C 標准說右移是合乎邏輯的。

對於有符號類型,C 標准沒有說明它是算術還是邏輯。 它將它留給實現來定義該實現使用哪個(或可能定義其他東西)。 這可能是由於歷史; 早期的機器可能沒有提供算術右移指令(甚至可能沒有使用二進制補碼),盡管這些天似乎很難想象。

因此,當您編寫向右移動的代碼並且想要確定將獲得的結果時,您可以使用無符號類型來確保獲得邏輯移動。

在二進制補碼表示中,最高位保留用於符號。 最高位為 0 表示正數,1 表示負數。 如果你右移負數的位,最初在最高位的 1 將被移動到下一個低位,如果你繼續移動這些位,最終會以最低位結束。 在代碼中,for 循環將 x 的位移動一位 position 並將移位后的值分配給 x。

for (b = 0; x != 0; x >>=1 )

首先b,用於統計1位的個數,將個數設置為0。

繼續循環的條件是 x.= 0。當所有 1 位都從 x 中移出時,剩下的只有 0 位。 x 將等於 0。

每次迭代后執行的操作是將 x 中的值右移 1。

循環體中的 if 條件對 x 執行按位與運算。 位掩碼的值為 1,它是 int 值的一個實例,除了最低位之外,所有位都為 0。 如果最低位為 1,則 AND 運算將評估為 1(或在 C 中為真),如果最低位為 0,則評估為 0(或在 C 中為假)。如果 if 條件為,則增加一位的計數真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM