一、巨集setbit、getbit、clearbit
#define getbit(data,i) ((data
&(0x0001
<1:0)
#define setbit(data,i) ((data)|=(0x0001
<<(i)))
#define clearbit(data,i) ((data)&=(~(0x0001
<<(i))))
1.首先在stm32上常數預設是int型的。
2.因為常數是int型,所以是4位元組(stm32是32位系統,int型資料和long型資料都是32bit),故這裡i的範圍是0~31。如果i超過31(大於等於32),則會出現如下報錯:
warning[pe063]: shift count is too large
3.當i=31時會出現如下報錯:
warning[pe068]: integer conversion resulted in a change of sign (整型轉換導致符號改變)
原因:
當1<<30,結果是0x40000000,即1073741824,結果是正數。
當1<<31,結果是0x80000000,即-2147483648,結果是負數。
對於上面的巨集,比較好的寫法是:
typedef unsigned int u32;
#define getbit(data,i) ((data
&((u32)1
<1:0)
#define setbit(data,i) ((data)|=((u32)1
<<(i)))
#define clearbit(data,i) ((data)&=(~((u32)0x01
<<(i))))
常見位操作
位與 操作 1 1 1 1 0 0 0 0 0 特點 只有全是1的時候才是1,其他情況都是0.總結 任何數和0位與就是0,和1位與沒有變化,所以位與常用在清零上 清零用位與 位或 操作 1 1 1 1 0 1 0 0 0 特點 只有全0的時候才是0,其他情況都是1.總結 任何數和1位或就是1,和0位...
常見位運算
builtin ffs x 返回x的最後一位1是從後向前第幾位 builtin popcount x 返回x的二進位制下1的個數 x x 只保留最後一位1的二進位制 x x x 1 清零最低位的1 x 1 判斷奇偶 x 1 n 將第n位置1 x 1 n 將第n位置0 x 1 k 1 對x的第k位取反...
重溫位操作 C 位操作介紹
c 位操作包括兩種 傳統的c語言方式的位操作和c 中利用bitset容器的位操作 一 傳統的c方式位操作 1.基本操作 使用乙個unsigned int變數來作為位容器。2.操作符 按位或操作符 result exp1 exp2 當exp1和exp2中對應位中至少有乙個為1時,result中對應位為...