嵌入式C学习

位运算

程序中所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。常见的位运算有:and运算&、or运算|、xor运算^、not运算~、shl运算<<和shr运算>>。

and运算 &

and运算通常用于二进制的取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
相同位的两个数字都为1,则为1;若有一个不为1,则为0。

例如:
00101
11100
(&;and)
00100

or运算 |

or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。

例如:
00101
11100
(|;or)
11101

xor运算 ^

xor运算常用于对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作。 操作的结果是如果某位不同则该位为1, 否则该位为0。
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密。
相同位不同则为1,相同则为0。

例如:
00101
11100
(^;xor)
11001

not运算 ~

not运算的定义是把内存中的0和1全部取反。使用not运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差。
无符号整数与有符号整数:计算机的数是用二进制表示的,最左边的这一位一般用来表述该数的正负,如果存在这种情况则为有符号整数,否则为无符号整数。

shl运算 <<

a shl b就表示把a转为二进制后左移b位,即在后面添b个0。例如100的二进制1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。

shr运算 >>

a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。

优先级

优先等级位运算
1not运算
2shl运算、shr运算
3and运算
4xor运算
5or运算

位运算操作

1.不改变其他位值,只对某几位设值。
方法:先对需要设置的位使用与操作进行清零,然后使用或操作设置相应值。
2.移位操作提高代码可读性和可重用性
3.取反操作提高代码的可读性

静态变量与静态函数

静态变量与静态函数的基本概念

静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配存储空间的一类变量,同时在运行时中不再改变分配情况。
自动变量(Automatic Variable)在计算机编程领域指的是局部作用域变量,具体来说即是在控制流进入变量作用域时系统自动为其分配存储空间,并在离开作用域时释放空间的一类变量。
静态函数函数的结果不会被访问或者修改对象,如果静态函数声明以后就会对其他源文件隐藏,无法进行调用。

静态的作用

1.利用静态的特性可以在不同文件里定义同名函数和同名变量,而不必担心命名冲突。
2.存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。在下次使用静态变量时,则不会在去初始化。
3.默认初始化初值为0。在静态存储区共有两种变量存储:全局变量和 static 变量,而且在静态数据区,内存中所有的字节默认值都是0x00

总结

static最主要的功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。

extern变量

extern最基本的用法就是声明全局变量,需要注意两点,一是“声名”,二是“全局变量”。需要注意的是,声名和定义是有去别的,声名只是指出了变量的名字,并没有分配储存空间,定义是指出变量的名字同时为变量分配存储空间,定义当中包含声名。对于extern声名变量可以多次,而定义只有一次。

关键字const和宏定义define

区别

(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
(4)调试方式不同
define不可以被调试
const可以被调试

const的优点

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
(3)const可节省空间,避免不必要的内存分配,提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值