簡體   English   中英

僅使用位操作,返回標記最高有效 1 位為 position 的掩碼。 如果 x == 0,返回 0

[英]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.

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