一、位运算的重要性
位运算在C语言中有很重要的地位,底层驱动基本都是采用C语言编写的,驱动之所以能够操作硬件,是因为能够实现对寄存器直接进行控制,在实现寄存器控制时,必须通过按位操作才能够实现
二、常用的位操作符
常用的操作符对按位与、位或、位取反、异或等等
2.1 位与(&)
位与就是对数据的二进制位进行运算,两个数据的二进制位全为1时,则位与结果为1,只要有一个数据的二进制位位0时,则结果为0。
数据1 | 1 | 1 | 0 | 0 |
数据2 | 1 | 0 | 1 | 0 |
位与(&)结果 | 1 | 0 | 0 | 0 |
例子 3 & 5 = ?
首先把3转化成二进制:0b0011
其次把5转换成二进制:0b0101
那么3 & 5 = 1
2.2 位或 (|)
对两个数的二进制进行位或运算,同0为0,有1为1。其表如下
数据1 | 1 | 1 | 0 | 0 |
数据2 | 1 | 0 | 1 | 0 |
位或(|) | 1 | 1 | 1 | 0 |
例子:3 | 5 = ?
3转换成二进制为:0b0011
5转换成二进制为:0b0101
结果: 3 | 5 = 7
2.3 位取反(~)
位取反就是将操作数的二进制位逐个按位取反操作。1取反变成0,0取反变成1
~1 = 0、 ~0 = 1
例子: ~10 = ?
10转化成二进制:0b1010
结果:~10 = 5
2.4 位异或 (^)
位异或就是将两个数的二进制位进行位异或运行,相同为0,不同为1
数据1 | 1 | 1 | 0 | 0 |
数据2 | 1 | 0 | 1 | 0 |
位异或(^) | 0 | 1 | 1 | 0 |
例子:3 ^ 5 = ?
3转化成二进制:0b0011
5转化成二进制:0b0101
结果:3 ^ 5 = 6
2.5 位左移(<<)
位左移就是将一个数转化成二进制位全部左移若干个位,左边移出去的直接丢弃,右边空出来的位直接补0处理
例子:5 << 2 = ?
首先把5转化成二进制:0b0000 0101
结果:5 << 2 = 20
2.6 位右移(>>)
位右移就是将一个数转化成二进制数之后全部右移若干位,左边的二进制位补0或者补1(这里需要注意一下,如果是无符号或者有符号整数就补0,如果是有符号符数就补1),右边的二进制位直接丢弃即可
例子:5 >> 2 = ? (-5) >> 2 = ?
补充知识: 原码、反码、补码(正数与符数如何使用二进制表示)
原码:0表示整数、1表示符数
例如:[+7]原 = 0b0000 0111 [-7]原 = 0b1000 0111
反码:整数的反码与源码相同;负数的反码,符号位为1不变,数字部分按位取反
[+7]反 = 0b0000 0111 [-7]反 = 0b1111 1000
补码:正数的补码和源码相同;负数的补码则是符号位为1,数值部分按位取反之后在末尾位加一就是补码
[+7]补 = 0b0000 0111 [-7]补 = 0b1111 1001
5转化成二进制为:0b0000 0101
-5转换成二进制为:0b1111 1011
结果:5 >> 2 = 1 (-5) >> 2 = 0
三、总结
以上就是所有的按位操作基础。之后会陆续增加按位操作在寄存器中常用的操作,特定位操作等相关知识,敬请期待。。。