![](/img/trans.png)
[英]Create a mask that marks the most significant set bit, using only bitwise operators
[英]Using only bit manipulations, return a mask that marks the position of the most significant 1 bit. If x == 0, return 0
作為我的編碼 class 的一部分,這是對 C 的介紹,我正在從事一個處理受限位操作的編碼項目。 特別是在這個問題上,我被卡住了,因為我不知道如何解決我的錯誤。
/*
* SigBitMask - return a mask that marks the position of the
* most significant 1 bit. If x == 0, return 0
* Example: SigBitMask(96) = 0x40
* Legal operations: ! ~ & ^ | + << >>
* Max operations: 16
* Rating: 4
*/
除了列出的合法操作外,我不能使用任何語句,如 do、if、while 或 else。 我也不允許轉換為其他數據類型。這包括使用無符號。 此外,我不能使用任何大於 0xFF 的常量,這對於這個問題非常重要,因為我不允許使用 0x80000000。 另外,假設我們使用的是 32 位機器。
這里的一件大事是我不能使用像 - 或 * 這樣的操作,這會使這更容易。
到目前為止,這是我的代碼:
int SigBitMask(int x) {
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x = x ^ (x >> 1);
return x & ~(x >> 1);
}
檢查軟件給我的錯誤是:
"ERROR: Test SigBitMask(-2147483648[0x80000000]) failed...
...Gives 0[0x0]. Should be -2147483648[0x80000000]
我不確定如何通過 go 解決我的問題。 我更喜歡的不僅僅是答案。 有人也能真正解釋這個過程嗎? 這個項目的重點是學習編碼 C。謝謝:)
編輯:我知道 Stack Overflow 上已經有類似的問題,但他們的限制與我的不同,而且我正在尋求幫助修復我的代碼,並了解原因。
Edit2:闡明了 max 和 legal ops 的含義
擺脫你的最后一行,因為它沒有做任何事情。 所以你的 function 變成:
int SigBitMask(int x) {
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return x ^ (x >> 1);
}
這對於非負輸入非常有效,但對於負輸入,當最后一行運行時x
將為 -1,因此最后一行將給出零結果。 但這很糟糕,因為我們想要為所有負輸入返回 -2147483648(即 0x80000000)。
如果我們可以通過使用|
修補return
表達式會怎樣? 將它與另一個表達式組合,當 x 為 -1 時為 0x80000000,當 x 為非負時為 0? (我們不關心x
的其他負值的值。)你能想到這樣的表達式嗎? 我可以想到一個只使用 3 個運算符的方法,但它涉及一些未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.