C语言学习笔记(十三)

位操作运算符

&,|,~,^,<<,>>

位和字节

数据在内存中是以二进制的形式存放的,位是计算机存储的最小单位,一个二进制位可以表示两种状态(1 和 0),多个二进制位组合起来,可以表示更多信息,一个字节有8个二进制位,是一种约定俗成,一个字节也可以有16个二进制位。C语言 int 类型占4个字节,32个二进制位。字符在内存中占一个字节,8位。普及一个知识,ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)。不同的数据类型占用的字节数不同,结构体类型占用更多的字节。

首先要把参与运算的数,转成2进制的形式(只有0和1)。现代高级点的计算器可以实现不同进制之间的转换。

按位与 &

两个对应的二进制都为1,结果为1,否则为0。根据这个特点,总结出两点,x & 1 = x, x & 0 = 0。一个数和1与等于它本身,一个数和0与等于0。与操作的一个用途是清零,一个用途是取特定位。

按位或 |

两个对应的二进制都为0,结果为0,否则为1。根据这个特点,总结出两点,x | 1 = 1, x | 0 = x。一个数和1或等于它1,一个数和0或等于它本身。与操作的一个用途是置1。

取反 ~

单目运算符,0变1,1变0;

异或 ^

两个对应的二进制相同为0,不同为1。

异或操作的主要用途是能使特定的位翻转。实现两个变量的互换。

1
2
3
x = x ^ y;
y = y ^ x;
x = x ^ y;

循环左移与循环右移

1
2
3
4
循环左移(低位补0)(x | 0 = x)
z = (value >> (32 - n)) | (value << n);
循环右移(高位补0)
z = (value << (32 - n)) | (value >> n);

位段

位段是一种特殊的结构类型,其所有成员的长度均以二进制位为单位定义的。当内存资源十分珍贵时,使用位段可以减少内存的消耗。

1
2
3
4
5
struct attriture
{
unsigned font:2;//2 个二进制位
unsigned color:4;
}