2017-09-14 34 views
2

我的任務是編寫一個或多個C語句,清除變量「x」的位11和12(而不會干擾其他位使用位)級C運營商。我的教授說:「下面聲明的變量」掩碼「可能會有所幫助。」在不干擾其他位的情況下寫入C語句清除兩位

int mask = 0x00001800; 

int x = arbitrary_value; 

我應該使用移位操作結合位級操作嗎?我有點不清楚如何做到這一點。

+0

想想可用位運算符和他們做。 – dbush

+0

從課堂上,我記得我們覆蓋了&,|,〜和^。我會再看一遍。 –

+0

'x =(x | mask)^ mask;'是一種不依賴'x'爲'int'或者更窄的方法。即使「x」比「mask」寬得多,也可以工作。 – chux

回答

3

@Garrett, 武力或掩蓋一些值,您將使用按位操作數(&,|,〜,^)。 如何做到這一點取決於你。您可以創建一個掩碼,就像創建0x00001800那樣。如果你將這個掩碼轉換爲二進制,你會得到這個:1100000000000。正如你可以看到從右側開始,位11和位12是唯一保持高位的位。

現在,要使用這個掩碼來掩蓋一個值,你需要知道你想要做什麼。對於你的情況,你想強制另一個變量的第11位和第12位爲0,因此,強制某事爲0,你可以使用AND按位操作數(&)傳遞0,如果你想迫使0和1,它如何在另一個變量上。 如果你想使用掩碼0x1800進行這個操作,你必須先倒置他所有的位,因爲你需要0s,這個掩碼有1s,右邊有1s,它有0s。要反轉所有的位,你可以使用NOT按位操作,如:

int mask = 0x1800; 
int invertedMask = ~mask; 

值的變量在二進制:

面膜= 11000億 invertedMask = 0011111111111

現在,您可以強制位11 12從一個變量到零,例如:

int mask = 0x1800; //Value in binary 1100000000000 
int value = ‭7347‬; //Value in binary 1110010110011 
int finalValue = 0; 

mask = ~mask; // Now mask value is 0011111111111 
finalValue = value&mask; //final value is 0010010110011 

正如你所看到的,位11和12(從右到左)被強制關閉,而ot她的住宿權在的價值變量。

使用這個原則,你可以使用很多其他的組合,包括移位的位來去除你的掩碼的位,例如。

+1

提交詳細的作業分配解決方案將使OP沒有優勢... – Herb

+0

表達式x和0x7FF的工作原理是什麼? 0011111111111 = 7FF是不是十六進制? –

+0

@chux,謝謝我犯了一個錯誤。我會使用255,我改變了主意使用7347,所以我更新了二進制文件,但不是int值,哈哈。 –

1

抓住一張紙或打開您選擇的編輯器,然後以二進制格式重寫掩碼的十六進制表示法。

注意哪些位被設置?

現在您需要組合一些布爾操作來實際清除x中的這些位。提示:你的基本操作都需要2的相關詳細位置:

https://en.wikipedia.org/wiki/Boolean_algebra#Operations

要小心,以確保,每一個可能的輸入被覆蓋,即:

00 -> 00 
01 -> 00 
10 -> 00 
11 -> 00 
相關問題