2012-03-28 68 views
2

我一直在閱讀Kernighan和Ritchie的「The C Programming Language」。解釋包含按位運算符的C語句的工具

我發現它很難通過部分得到2.9位運算符

具體做法是:

練習2-6編寫一個函數setbits(X,P,N,Y),其回報x,其中 n位開始於位置p設置爲y的最右邊的n位, 保持其他位不變。

有一個聰明的叫做理查德希思菲爾德的小夥子練習here的答案。

理查德的回答是:

return (x & ((~0 << (p + 1)) 
      | (~(~0 << (p + 1 - n))))) 
    | ((y & ~(~0 << n)) << (p + 1 - n)); 

問題

有誰知道一個工具,將解釋的代碼行類似上面的?

我希望存在類似於各種在線正則表達式解釋器,但對於按位操作。

+0

像堆棧溢出的人的工具嗎? ;) – Shahbaz 2012-03-28 15:31:44

+8

鉛筆和紙張? – 2012-03-28 15:32:18

+1

我不認爲有一種工具可以解析位運算符表達式並向您解釋。您很可能必須閱讀每位運營商以瞭解代碼背後的含義。請查看以下鏈接http://www.cprogramming.com/tutorial/bitwise_operators.html,並一次性完成各部分內容,並嘗試用簡單的英語(或您選擇的語言)向自己解釋,以確保您瞭解 – 2012-03-28 15:33:41

回答

2

讓我們讓這個人可讀嗎?

Xÿp,和Ñ輸入

temp1中TEMP2TEMP3,和結果等於零

let temp1等於p加1
temp1中等於0一的補左移temp1中
temp1中等於的位與Xtemp1中

左讓temp2等於p加1減去n
TEMP2等於0的補數左移TEMP2
TEMP2是等於TEMP2

一的補離開讓temp1中是等於位或temp1目錄TEMP2

TEMP3等於p加1減去ñ

TEMP2等於0的補數左移ň
離開讓TEMP2是等於TEMP2
一補,讓TEMP2等於按位與的ÿTEMP2

TEMP2等於TEMP2左移TEMP3
離開讓結果等於位或的temp1中TEMP2

來源:我的大腦。

從本C代碼(從OP擴大):

int setbits(int x, int p, int n, int y) 
{ 
    int result = 0; 

    // evaluate the expression 
    { 
     int temp1 = 0; 
     int temp2 = 0; 
     int temp3 = 0; 

     temp1 = p + 1; 
     temp1 = ~0 << temp1; 
     temp1 = x & temp1; 

     temp2 = p + 1 - n; 
     temp2 = ~0 << temp2; 
     temp2 = ~temp2; 

     temp1 = temp1 | temp2; 

     temp3 = p + 1 - n; 

     temp2 = ~0 << n; 
     temp2 = ~temp2; 
     temp2 = y & temp2; 

     temp2 = temp2 << temp3; 
     result = temp1 | temp2; 
    } 

    assert(result == ((x & ((~0 << (p + 1))| (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n)))); 

    return result; 
} 
+0

這並不能解釋任何事情。或者那是重點? – 2012-03-28 15:56:57

+0

@OliCharlesworth他只是要求解釋,他已經知道代碼做了什麼,這只是幫助他理解它是如何工作的。 – 2012-03-28 15:58:19

+1

這解釋了每個操作的作用,而不是它的工作原理。 – 2012-03-28 16:05:30