請閱讀【嵌入式開發學習必備專欄】
文章目錄
- 將數值的第 s 位到 e 位清零
將數值的第 s 位到 e 位清零
為了定義一個VAL_CLR_BITS(val, s, n)
宏,該宏將變量val
的第s
位到第n
位清零(假設n >= s
),其余位的值保持不變,我們可以使用位操作來實現這一目標。以下是宏的一個可能實現:
#define VAL_CLR_BITS(val, s, n) ((val) & (~(((1ULL << ((n) - (s) + 1)) - 1) << (s))))
這個宏的工作原理如下:
1ULL << ((n) - (s) + 1)
:首先將1(使用unsigned long long
類型以確保寬度)左移(n - s + 1)
位。這樣做的目的是創建一個值,其中有(n - s + 1)
個1位,與val
中從s
到n
位對應的位數相同。-1
:然后,從這個值中減去1,這會將所有的1位左移后的結果變為0,其余為1。<< (s)
:接著,將上一步得到的值左移s
位,這樣就將清零的位對準了val
的第s
位到第n
位。~
:然后對上一步的結果取反,這會將要清零的位變為0,其余位變為1。&
:最后,使用與操作&
將val
與第4步得到的掩碼進行位與操作。由于掩碼中第s
位到第n
位為0,其余位為1,因此這一操作將清零val
的第s
位到第n
位,而保留其余位的值不變。
下面是一個如何使用VAL_CLR_BITS
宏的示例:
#include <stdio.h>#define VAL_CLR_BITS(val, s, n) ((val) & (~(((1ULL << ((n) - (s) + 1)) - 1) << (s))))int main(void)
{unsigned int val = 0xFFFF; // 16位寬的值,初始全為1unsigned int s = 4; // 起始位unsigned int n = 7; // 結束位unsigned int result = VAL_CLR_BITS(val, s, n);printf("Original value: 0x%X\n", val);printf("After masking: 0x%X\n", result);return 0;
}
這段代碼將輸出val
的原始值和應用VAL_CLR_BITS
宏后的結果。在這個示例中,val
初始值為0xFFFF
,即所有位都是1。應用VAL_CLR_BITS(val, 4, 7)
后,結果將是0xFF0F
,即第4位到第7位被清零。