首先,先让我们了解一下什么是二进制。二进制是一种以2为基数的数字系统。和我们平时使用的十进制不同,二进制只包含0和1两个数值,每一位代表不同的权值。例如,二进制数1011,其权值分别为8、4、2和1,可以转换为十进制数11。
C语言中提供了一些位运算符和位操作函数,可以对二进制数进行操作。这些操作通常都是在二进制位层面上进行的,因此也被称为“位操作”。
下面,我们来看看几个位运算符和位操作函数的具体用法和示例。
位运算符
& 运算符
& 运算符表示按位与运算。它对两个二进制数的每一位进行运算,只有当两个数的对应位都为1时,结果的对应位才为1,否则为0。
例如,二进制数 1011 和 1101 进行按位与运算后的结果是 1001。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = 13; // 二进制为1101
unsigned int c = a & b; // 按位与运算,结果为 1001
| 运算符
| 运算符表示按位或运算。它对两个二进制数的每一位进行运算,只要其中一个数的对应位为1,结果的对应位就为1,否则为0。
例如,二进制数 1011 和 1101 进行按位或运算后的结果是 1111。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = 13; // 二进制为1101
unsigned int c = a | b; // 按位或运算,结果为 1111
^ 运算符
^ 运算符表示按位异或运算。它对两个二进制数的每一位进行运算,只有当两个数的对应位不同,结果的对应位才为1,否则为0。
例如,二进制数 1011 和 1101 进行按位异或运算后的结果是 0110。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = 13; // 二进制为1101
unsigned int c = a ^ b; // 按位异或运算,结果为 0110
~ 运算符
~ 运算符表示按位取反运算。它对二进制数的每一位进行取反,将原来为1的位变为0,原来为0的位变为1。
例如,二进制数 1011 进行按位取反运算后的结果是 0100。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = ~a; // 按位取反运算,结果为 0100
<< 运算符
<< 运算符表示左移运算。它将一个二进制数的所有位向左移动指定的位数,空出来的低位补0。
例如,二进制数 1011 左移2位后的结果是 101100。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = a << 2; // 左移2位,结果为 101100
>>运算符
运算符表示右移运算。它将一个二进制数的所有位向右移动指定的位数,空出来的高位补0。
例如,二进制数 1011 右移2位后的结果是 0010。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = a >> 2; // 右移2位,结果为 0010
位操作函数
除了位运算符,C语言还提供了一些位操作函数,可以更方便地进行位操作。
位清零函数(&=)
这个函数可以将一个二进制数指定位的值清零,即将这些位都变为0。
代码示例:
unsigned int a = 11; // 二进制为1011
a &= ~(1 << 2); // 将第3位(从右数)清零,结果为 1001
位置1函数(|=)
这个函数可以将一个二进制数指定位的值设置为1,即将这些位都变为1。
代码示例:
unsigned int a = 9; // 二进制为1001
a |= 1 << 2; // 将第3位(从右数)置为1,结果为 1011
取反函数(^=)
这个函数可以将一个二进制数指定位的值取反,即将这些位都进行按位取反运算,1变成0,0变成1。
代码示例:
unsigned int a = 11; // 二进制为1011
a ^= 1 << 2; // 将第3位(从右数)取反,结果为 1001
位读取函数(&)
这个函数可以读取一个二进制数指定位的值,即返回指定位的值是1还是0。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = a & (1<<2); // 获取第3位(从右数)的值,结果为 1
位置反函数(~)
这个函数可以将一个二进制数的所有位进行按位取反运算,1变成0,0变成1。
代码示例:
unsigned int a = 11; // 二进制为1011
unsigned int b = ~a; // 对a进行按位取反运算,结果为 0100
这样,我们就来到了本文的结尾。希望通过本文的介绍,大家对位运算符和位操作函数有了更深入的了解。