C语言位操作
1. C语言中位操作的方法很多,只要写的执行效率跟按位与,按位或一样就行了,三条汇编指令搞定,
有些习惯用按位与加按位取反来清除某一位的,效率还没以上的方法来的快。
2. 这样的定义方便在寄存器操作中对某位给特定的名称,也适合不支持位寻址的内存变量的访问,让程序可读性提高。
例如在不支持sbit关键字的环境下,可以给要操作的位取个名称,如 #define INT_ENABLE BYTE_SET_BIT(0xA8, BIT7);
3. 适合程序中需要用到标志位的地方,让标志位不占额外的内存空间,并且可读性好,移植性好,易扩展。
#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. 适合程序中需要用到标志位的地方,让标志位不占额外的内存空间,并且可读性好,移植性好,易扩展。
*/
int main(char *argc, char *argv[])
{
unsigned char a = 0;
unsigned short b = 0;
unsigned long c = 0;
BYTE_SET_BIT(&a, BIT5);//((BYTE_BIT*)&a)->BIT5 = 1
BYTE_SET_BIT(&a, BIT3);
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);
BYTE_CLR_BIT(&a, BIT3);
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);
}