位操作和宏

来源:互联网 发布:万维网域名续费 编辑:程序博客网 时间:2024/05/16 17:33

位操作和宏

1.进制
十进制: 111 = 1*10^2 + 1*10^1 + 1*10^0
八进制: o111 = 1*8^2 + 1*8^1 + 1*8^0
十六进制:0x111 = 1*16^2 + 1*16^1 + 1*16^0
二进制: 111 = 1*2^2 + 1*2^1 + 1*2^0

1个字节 = 8个位

二进制权位: 1 1 1 1
8 4 2 1

十六进制 <=============转换 =============> 二进制
0xCBCD C=8+4 B=8+2+1 C=8+4 D=8+4+1 1100 1011 1100 1101

位运算符
左移运算<< unsigned char var=0x8a; var<<2 = 0x28 8a:10001010 00 char 类型最多存8位,最左边的10溢出舍去
右移运算>> unsgined char var=0x8a; var>>2 = 0x22 8a:100010
左移运算<< unsigned short var=0x8a; var<<2 = 0x228 8a:10001010 00
右移运算>> unsgined short var=0x8a; var>>2 =0x22

左移右移运算执行效率比乘法除法执行运算高

位运算
unsigned short var;

对var完成以下操作: bit[0…7]
将bit[7]设置为1: var |= (1<<7);
将bit[7]设置为0: var &= ~(1<<7)
将bit[7]反转: var ^= (1<<7);
将bit[7:4]4个位设置为1: var |= 0xF0; var|=(0xF<<4)
将bit[7:4]4个位设置为0: var &= 0F; var &= ~(0xF<<4)
将bit[7:4]4个位反转: var ^= (0xF<<4)
将bit[7:4]设置为1010: var |= (5<<5); var&= ~(5<<4);

查看bit[7]的值: (var>>7) & 1
查看bit[7:4]的值: (var>>4) & 0xF
查看bit[6:5]的值: (var>>5) & 0x3

虚拟地址到物理地址的映射

位字段
位字段(bit field)是一个signed int或unsigned int中一组相邻的位。位字段由一个结构体声明建立,该结构体声明为每个字段提供标签,并决定字段的宽度,例如:

struct gpio_bit{    unsigned int  gpb0:2;    unsigned int  gpb1:2;    unsigned int  gpb2:2;    unsigned int  gpb3:2;    unsigned int  gpb4:2;    unsigned int  gpb5:2;} ;

如果声明的总数超过了一个unsigned int大小,那么会使用下一个unsigned int的存储位置。这时不允许一个字段跨越两个unsigned int之间的边界。
位域:冒号后面数字代表几位


简单的替换,写宏时不要忘记加()

#define   MAX_STUDENTS           10#define    ADD(a, b)                        a+b //#define    ADD(a, b)  ((a)+(b))#define    MUL(a,b)                         a*b //#define    MUL(a,b)   ((a)*(b))
for(i=0; i<MAX_STUDENTS; i++)        ..... var = 5 * ADD(3, 4)  //5*3+4=19   var = MUL(3+4, 5)   //3+4*5=23
 #if 0  /*注释在这里*/  一会要编译,一会不想编译的代码。#endif
 #include <stdio.h> 与  #include "stdio.h" 区别

<>:系统头文件下找,没找到报错,系统的代码 “”:系统头文件下找,没找到再在当前找,用于自己写的代码 头文件内容放到c文件下来

//避免头文件重复包含的问题:

#ifndef_TEST_H#define_TEST_Hstruct a{ lll}#endiftest.h_TEST_H#define_TEST_Hstruct a{  lll}
原创粉丝点击