2017-07-26 40 views
0

我必須說w = 33的程序輸出。我不知道該怎麼做。有沒有人有一個想法如何解決這個問題,而不寫每個數字的二進制表示?在c中使用位輸出

void notChicken(int w) 
{ 
    unsigned int v1 = 0x12345678; 
    unsigned int v2 = 0x87654785; 
    unsigned int v3 = 0xffffffff; 
    unsigned int tmp; 
    tmp = (v1 >> 3) | (v2 << 3); 
    tmp &= v3 & ~(v3 << (w >> 1)); 
    printf("%8x\n", tmp); 
} 

感謝

+0

至於一種瞭解發生了什麼的方法,將所有表達式分解成最簡單的子表達式。將每個子表達式存儲在一個單獨的變量中。然後使用調試器在監控變量的同時逐行執行代碼,以查看每個步驟中發生的情況。 –

+0

或者如果您無法通過調試器訪問計算機,請使用*筆和紙!* –

+1

如果沒有計算機,最簡單的方法是使用筆和紙轉換爲二進制文件。至少直接在十六進制數字上進行比特級操作超出__我的智力可能性。 –

回答

2

雖然不是一個好主意,讓我們嘗試打破你的操作。

你給w = 33

最後一部分 -

v3 & ~(v3 << (w >> 1))是要評估爲v3 & ~(v3 << 16)

v3 << 160xffff0000和那~0xffff

因爲v3是所有那些你得到0xffff。這將掩蓋先前計算的高16位。

現在(v1 >> 3) | (v2 << 3);

我們只關心低16位。

>> 3由8和<< 3除以由8.

乘以所以第一部分的結果將是

0x2468ACF | 0x3B2A3C28 

僅保持低16位

0x8ACF | 0x3C28 

最後,我不知道如何在不編寫按位表示的情況下執行OR操作。我可以幫助最後一個十六進制。它將是F

+0

'C'2''''','A''''''''''''''''(如果其他計算正確):'0x8ACF | 0x3C28' - >'BEEF' – 4386427

+0

@ 4386427我會寫,但我不知道如何解釋我如何得到C | 2 = E而不通過位表示。 –

+0

@ 4386427也有趣的是'notChicken(33)== 0xBEEF' :) –