簡體   English   中英

使用 C 中的運算符從無符號整數中獲取 6 個最高有效位的最佳方法?

[英]Best way to grab 6 most significant bits from an unsigned int using operators in C?

我已經設法擺脫了前幾個位,但是我如何只保留 C 中的 6 個最高有效位? 我試過((num << 6) & 1)沒有運氣

要獲得 integer 而不是 rest 的最高有效六位,請按位與設置高六位的掩碼並清除 rest。

因為unsigned int是純二進制類型,所以它的最大值UINT_MAX的所有位都已設置。 然后UINT_MAX >> 6將它們向右移動,產生高六位清零和 rest 設置的結果。 執行按位 NOT, ~ (UINT_MAX >> 6)會產生設置高六位且 rest 清除的結果。

然后num & ~ (UINT_MAX >> 6)產生num的高六位,其余位清零。

UINT_MAX<limits.h>中聲明。 由於 C 對無符號類型的包裝算法,您還可以使用-1u獲得unsigned int的最大值,因此num & ~ (-1u >> 6)也可以使用。

通用方法不取決於 integer 的寬度

#define  C6B(num) ((num) & ~((1ull << (sizeof(num) * CHAR_BIT - 6)) - 1))

OP 希望將 6 個 MSbits 留在原來的位置 其他答案解決了這個問題。


如果我們希望這些轉移到最不重要的地方,一個常見的解決方案如下所示。 這假設unsigned數具有 32 位。 雖然很常見,但 C 並未指定。

num >> (32 - 6)

或者,我們可以使用下面的。 這假設沒有填充位,這對於unsigned來說很常見。

#include <limits.h>
num >> (sizeof num * CHAR_BIT - 6)

或者,我們可以不做任何假設並從UINT_MAXinteger 類型的值位中確定位寬:

// Bits in a MAX integer type
// https://stackoverflow.com/a/4589384/2410359
#define IMAX_BITS(m) ((m)/((m)%255+1) / 255%255*8 + 7-86/((m)%255+12))

#include <limits.h>
#define UINT_VALUE_BITS IMAX_BITS(UINT_MAX)

num >> (UINT_VALUE_BITS - 6)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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