位操作和宏
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_H
struct a
{
lll
}
#endif
test.h
_TEST_H
#define_TEST_H
struct a
{
lll
}