一、获取位
/** 16进制值: 0x11111111
* 二进制值: 0001 0001 0001 0001 0001 0001 0001 0001
*/
#define GetBit(val, bit) ((val>>bit) & 0x1)
二、清除位
/** 16进制值: 0x11111111
* 二进制值: 0001 0001 0001 0001 0001 0001 0001 0001
*/
#define ClearBit(val, bit) (val &= ~(0x1<<bit))
三、设置位
/** 16进制值: 0x11111111
* 二进制值: 0001 0001 0001 0001 0001 0001 0001 0001
*/
#define SetBit(val, bit) (val |= (0x1<<bit))
四、测试
测试代码
int main()
{
int i = 0x11111111;
int j = 0;
int cnt = 0;
for(j = 31; j>-1;j--)
{
printf("%d", GetBit(i,j));
cnt++;
if(cnt==4)
{
cnt = 0;
printf(" ");
}
}
printf("\n");
ClearBit(i, 4);
printf("GetBit: %d\n", GetBit(i,4));
printf("i = 0x%x\n", i);
SetBit(i, 2);
printf("i = 0x%x\n", i);
}
测试结果
其中, 16进制0x11111101 对应的二进制为: 0001 00010001 0001 0001 0001 0000 0001,对应的bit4位置为清零,代码正确;
16进制0x11111105 对应的二进制为:0001 0001 0001 0001 0001 0001 0000 0101,对应的bit2位置置1,代码正确;