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);
}

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据