簡體   English   中英

如何從 C 中的數字中提取位?

[英]How to extract bits from a number in C?

我需要在 C 中提取短數據類型的特定部分(位數)。

Fox 示例,我有一個45作為101101的二進制文件,我只想要中間的 2 位,例如 ( 10 )

兩天前我開始使用 C 代碼,所以不要提供很多功能。

我如何提取它們?

請搜索按位操作以獲取更多一般信息,並為您的特定問題搜索位掩碼。 不過,如果您是編程新手,我不建議您直接跳到位。

解決方案將根據您的輸入長度是否固定而略有變化。 如果它不能修復,您需要相應地安排您的面具。 或者您可以使用其他方法,這可能是最簡單的方法。

為了獲得您想要的特定位,您可以使用位掩碼。

例如,您有101101並且您想要中間兩位,如果您使用& ,則只有001100上為1的位將在源中保持不變,所有其他位將設置為0 實際上,您將擁有您感興趣的那些位。

如果您不知道& (bitwise and)是什么,它需要兩個操作數,並且僅當第一個和第二個操作數為 1 時返回 1,否則返回 0。

輸入:1 0 1 1 0 1

掩碼:0 0 1 1 0 0


結果:0 0 1 1 0 0

作為 C 語法,我們可以這樣做:

unsigned int input = 45;

unsigned int mask = 0b001100; // I don't know if this is standard notation. May not work with all compilers
// or
unsigned int mask = 12; // This is equivalent

unsigned int result = input & mask; // result contains ...001100

如您所見,我們過濾了我們想要的位。 下一步取決於您要對這些字節做什么。

此時,結果001100對應於 12。我認為這並不是很有用。 你可以做的是,你可以移動這些位。 為了去掉右邊的0 ,我們可以它往右邊拉 2 位。 為此,我們需要使用>>運算符。

0 0 1 1 0 0 >> 2 ≡ 0 0 0 0 1 1

result = result >> 2; // result contains ...011

從那里,您可以設置一個 bool 變量來將它們中的每一個存儲為10

unsigned char flag1 = result & 0b01; // or just 1
unsigned char flag2 = result & 0b10; // or just 2

你可以在不移動的情況下做到這一點,但這樣更清楚。

您需要屏蔽要提取的位。 如果假設您要創建設置了前 4 位的掩碼。 然后你可以通過使用: (1 << 4) - 1

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

void print_bin(short n)
{
    unsigned long i = CHAR_BIT * sizeof(n);
    while(i--)
        putchar('0' + ((n >> i) & 1));

    printf("\n");
}


int main()
{
        short num = 45; /* Binary 101101 */

        short mask = 4; /* 4 bits */
        short start = 0; /* Start from leftmost bit 
                                position 0 */

        print_bin((num >> start) & ((1 << mask) - 1)); /* Prints 1101 */

        mask = 2; /* 2 bits */
        start = 1; /* start from bit indexed at position 1 */

        print_bin((num >> start) & ((1 << mask) - 1)); /* Prints 10 */

        return 0;
}

Output:

0000000000001101
0000000000000010

暫無
暫無

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

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