[英]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 變量來將它們中的每一個存儲為1
或0
。
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.