Skip to content

寄存器操作

位运算

C
  1 #include <stdio.h>                                                                    
  2 
  3 int main(void)
  4 {
  5     int i = 0xff;
  6     printf("%x\n", 0xff&0x0);
  7     printf("%x\n", 0xf0&0x0f);
  8     printf("%x\n", ~0xff);
  9     printf("%x\n", 0x1<<3);
 10     printf("%x\n", 0x1000>>4);
 11 
 12     printf("%x\n", 0 ^ 0);
 13     printf("%x\n", 0 ^ 1);
 14     printf("%x\n", 1 ^ 0);
 15     printf("%x\n", 1 ^ 1);
 16     return 0;
 17 }

result:
0
0
ffffff00
8
100
0
1
1
0
实现高低位互换
C
  1 #include <stdio.h>                                       
  2 
  3 int main(void)
  4 {
  5     printf("%X\n", 0xAABB);
  6     printf("%X\n", 0xAABB>>8|0xAABB<<8&0xff00);
  7     return 0;
  8 
  9 }

result:
AABB
BBAA
判断是不是2的整数幂
C
  1 #include <stdio.h>                                                                    
  2 
  3 int main(void)
  4 {
  5     int m = 4;
  6     if((m & ( m-1 )) == 0)
  7         printf("%d is power of 2\n", m);
  8     else
  9         printf("%d isn't power of 2\n", m);
 10     return 0;
 11 }
数字交换
C
  1 #include <stdio.h>                                                                    
  2 
  3 void swap(int *a, int *b)
  4 {
  5     *a = *a ^ *b;
  6     *b = *a ^ *b;
  7     *a = *a ^ *b;
  8 }
  9 int main(void)
 10 {
 11     int a = 0x55;
 12     int b = 0x66;
 13     printf(" a:%X\n b:%X\n", a, b);
 14     a = a ^ b;
 15     b = a ^ b;
 16     a = a ^ b;
 17 
 18     printf(" a:%X\n b:%X\n", a, b);
 19     swap(&a, &b);
 20     printf(" a:%X\n b:%X\n", a, b);
 21     return 0;
 22 }

操作寄存器

0xffff0000 | 0x0f
0xffffffff & 0xffffff0f
0xffffffff & ~(0x000000f0)

可以直接宏定义

C
#define BIT_0 0x1
#define BIT_1 0x01<<1
...

位域

限定几个位长度的数据类型

  • 和结构体一块使用
C
  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 struct register_usb
  5 {
  6     unsigned short en :1;//设置一个位
  7     unsigned short ep :4;//设置四个位
  8     unsigned short mode :3;//设置三个位
  9 };
 10                                                                                       
 11 int main(void)
 12 {
 13     struct register_usb reg;
 14     memset(&reg, 0 , sizeof(reg));
 15     reg.en = 1;
 16     reg.ep = 4;
 17     reg.mode = 3;
 18     printf("szieof = %d\n", sizeof(reg));
 19     printf("reg:%x\n", reg);
 20     printf("reg.en:%x\n", reg.en);
 21     printf("reg.ep:%x\n", reg.ep);
 22     printf("reg.mode:%x\n", reg.mode);
 23     return 0;
 24 
 25 }
  • 和联合体一块使用
C
  1 #include <stdio.h>                                                                    
  2 #include <string.h>
  3 
  4 union spsr
  5 {
  6     unsigned short mode :3;
  7     unsigned short ep :4;
  8     unsigned short en :1;
  9 };
 10 
 11 int main(void)
 12 {
 13     union spsr reg2;
 14     memset(&reg2, 0, sizeof(reg2));
 15     reg2.mode = 3;
 16     printf("reg2:%x\n", reg2);
 17     return 0;
 18 
 19 }

对于没有使用的位可以使用匿名

C
  4 struct spsr
  5 {
  6     unsigned short mode :3;
  7     unsigned short :4;//不设置变量名
  8     unsigned short en :1;
  9 };