C语言中的位运算详解

发布时间:2024年01月12日

在C语言中,位运算符用于对二进制位进行操作,包括左移、右移、按位与、按位或、按位异或和按位取反等操作。本文将详细介绍C语言中的位运算符,包括运算规则和具体的例子。

1. 位运算符概述

C语言提供了一些位运算符,用于直接操作二进制位,这些运算符通常用于底层系统编程和优化。以下是常用的位运算符:

  • <<:二进制左移
  • >>:二进制右移
  • &:按位与
  • |:按位或
  • ^:按位异或
  • ~:按位取反

这些运算符的运算规则都是基于二进制的补码运算。

2. 位左移和位右移运算符

2.1 二进制左移 <<

左移运算符(<<)将一个数的各二进制位全部左移指定的位数,左边的二进制位丢弃,右边补0。在一定范围内,数据每向左移动一位,相当于原数据乘以2。

示例:

int num = 3;
int result = num << 2;  // 3左移2位,相当于3 * 2的2次幂
// result的值为 12

2.2 二进制右移 >>

右移运算符(>>)将一个数的各二进制位全部右移指定的位数。正数左补0,负数左补1,右边丢弃。在一定范围内,数据每向右移动一位,相当于原数据除以2。

示例:

int num = 8;
int result = num >> 2;  // 8右移2位,相当于8除以2的2次幂
// result的值为 2

3. 按位与、按位或和按位异或运算符

3.1 按位与 &

按位与运算符(&)的运算规则是对应位都为1才为1,否则为0。

示例:

int a = 9;  // 0b00001001
int b = 7;  // 0b00000111
int result = a & b;  // 按位与
// result的值为 1,二进制为0b00000001

3.2 按位或 |

按位或运算符(|)的运算规则是对应位只要有一个为1即为1,否则为0。

示例:

int a = 9;  // 0b00001001
int b = 7;  // 0b00000111
int result = a | b;  // 按位或
// result的值为 15,二进制为0b00001111

3.3 按位异或 ^

按位异或运算符(^)的运算规则是对应位一个为1一个为0才为1,否则为0。

示例:

int a = 9;  // 0b00001001
int b = 7;  // 0b00000111
int result = a ^ b;  // 按位异或
// result的值为 14,二进制为0b00001110

4. 按位取反运算符 ~

按位取反运算符(~)的运算规则是对应位为1,则结果为0;对应位为0,则结果为1。

示例:

int num = 9;  // 0b00001001
int result = ~num;  // 按位取反
// result的值为 -10,二进制为0b11110110

5. 结合赋值运算符

结合赋值运算符的经验,位运算符也有类似的结合赋值运算符,例如:<<=, >>=, &=, |= 等。

示例:

int num = 5;
num <<= 2;  // 将num左移2位,相当于num乘以2的2次幂
// num的值为 20

6. 应用实例

6.1 特定位清零

char x = 53;  // 0b00110101
x = x & 252;  // 0b11111100
// x的值为 52,二进制为0b00110100

6.2 判断特定位是否为零

char x = 53;  // 0b00110101
x = x & 128;  // 0b10000000
if (x == 0) {
    printf("最高位为0\n");
} else {
    printf("最高位不为0\n");
}

6.3 保留特定位

char x = 53;  // 0b00110101
x = x & 15;   // 0b00001111
文章来源:https://blog.csdn.net/qq_29752857/article/details/135543178
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。