|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
#include <stdio.h>#include <stdlib.h>
#include <string.h>
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
}BYTE_BIT;
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
char BIT8:1;
char BIT9:1;
char BIT10:1;
char BIT11:1;
char BIT12:1;
char BIT13:1;
char BIT14:1;
char BIT15:1;
}WORD_BIT;
typedef struct
{
char BIT0:1;
char BIT1:1;
char BIT2:1;
char BIT3:1;
char BIT4:1;
char BIT5:1;
char BIT6:1;
char BIT7:1;
char BIT8:1;
char BIT9:1;
char BIT10:1;
char BIT11:1;
char BIT12:1;
char BIT13:1;
char BIT14:1;
char BIT15:1;
char BIT16:1;
char BIT17:1;
char BIT18:1;
char BIT19:1;
char BIT20:1;
char BIT21:1;
char BIT22:1;
char BIT23:1;
char BIT24:1;
char BIT25:1;
char BIT26:1;
char BIT27:1;
char BIT28:1;
char BIT29:1;
char BIT30:1;
char BIT31:1;
}DWORD_BIT;
#define BYTE_SET_BIT(addr, b) ((BYTE_BIT*)addr)->b = 1
#define BYTE_CLR_BIT(addr, b) ((BYTE_BIT*)addr)->b = 0
#define WORD_SET_BIT(addr, b) ((WORD_BIT*)addr)->b = 1
#define WORD_CLR_BIT(addr, b) ((WORD_BIT*)addr)->b = 0
#define DWORD_SET_BIT(addr, b) ((DWORD_BIT*)addr)->b = 1
#define DWORD_CLR_BIT(addr, b) ((DWORD_BIT*)addr)->b = 0
/*
1. C语言中位操作的方法很多,只要写的执行效率跟按位与,按位或一样就行了,三条汇编指令搞定,
有些习惯用按位与加按位取反来清除某一位的,效率还没以上的方法来的快。
2. 这样的定义方便在寄存器操作中对某位给特定的名称,也适合不支持位寻址的内存变量的访问,让程序可读性提高。
例如在不支持sbit关键字的环境下,可以给要操作的位取个名称,如 #define INT_ENABLE BYTE_SET_BIT(0xA8, BIT7);
3. 适合程序中需要用到标志位的地方,让标志位不占额外的内存空间,并且可读性好,移植性好,易扩展。
4. 这套程序有两种用法,一种是像下面例程这样,另一种是你定义一个普通变量比如 short a; 然后通过宏来进行位操作,或者强制转化为上面的位结构类型,使用很灵活。
*/
int main(int argc, char *argv[])
{
BYTE_BIT a = {0};
WORD_BIT b = {0};
DWORD_BIT c = {0};
BYTE_SET_BIT(&a, BIT5); //a.BIT5 = 1
BYTE_SET_BIT(&a, BIT3); //a.BIT3 = 1;
WORD_SET_BIT(&b, BIT10);
WORD_SET_BIT(&b, BIT15);
DWORD_SET_BIT(&c, BIT20);
DWORD_SET_BIT(&c, BIT25);
printf("a=%#x, b=%#x c=%#x\n", a, b, c);
BYTE_CLR_BIT(&a, BIT5); //a.BIT5 = 0;
BYTE_CLR_BIT(&a, BIT3); //a.BIT3 = 0;
WORD_CLR_BIT(&b, BIT10);
WORD_CLR_BIT(&b, BIT15);
DWORD_CLR_BIT(&c, BIT20);
DWORD_CLR_BIT(&c, BIT25);
printf("a=%#x, b=%#x c=%#x\n", a, b, c);
} |
|