📜  关于位操作的全部(1)

📅  最后修改于: 2023-12-03 15:22:33.829000             🧑  作者: Mango

关于位操作的全部

位操作是计算机科学中很重要的一个概念,它常常用于处理二进制数据。在本文中,我们将深入探讨位操作的各种用途和技巧。

位运算符

在开始探索位操作之前,我们需要了解一些基本概念。C++中共有六个位运算符,它们分别是:

  • & 与运算
  • | 或运算
  • ^ 异或运算
  • ~ 取反运算
  • << 左移运算
  • >> 右移运算

这些运算符通常用于处理整数类型变量的二进制表示。接下来,我们将一一介绍它们的用途。

与运算(&)

与运算是指将两个二进制数按位进行与操作,得到的结果是一个新的二进制数。与运算有以下特点:

  • 只有在两个数对应的位都是1时,新二进制数的对应位才是1,否则为0。
  • 与一个数的对应位为0时,无论另一个数对应位是什么,结果都是0。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83
int b = 0b1111000;  // 二进制表示的数,等价于十进制的120

int c = a & b;      // 对a和b进行与运算,得到的结果是0b1010000,等价于十进制的80
或运算(|)

或运算是指将两个二进制数按位进行或操作,得到的结果是一个新的二进制数。或运算有以下特点:

  • 只有在两个数对应的位都是0时,新二进制数的对应位才是0,否则为1。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83
int b = 0b1111000;  // 二进制表示的数,等价于十进制的120

int d = a | b;      // 对a和b进行或运算,得到的结果是0b1111011,等价于十进制的123
异或运算(^)

异或运算是指将两个二进制数按位进行异或操作,得到的结果是一个新的二进制数。异或运算有以下特点:

  • 只有在两个数对应的位不相同时,新二进制数的对应位才是1,否则为0。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83
int b = 0b1111000;  // 二进制表示的数,等价于十进制的120

int e = a ^ b;      // 对a和b进行异或运算,得到的结果是0b0101011,等价于十进制的43
取反运算(~)

取反运算是指对一个二进制数的所有位进行取反操作,得到的结果是一个新的二进制数。取反运算有以下特点:

  • 对于一个n位的二进制数,取反后得到的是一个n位的二进制数。
  • 取反后的数字与原数字之和为$2^n-1$。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83

int f = ~a;         // 对a进行取反操作,得到的结果是0b11111111111111111111111101011000,等价于十进制的-84
左移运算(<<)

左移运算是指将一个二进制数的所有位向左移动若干位得到的结果是一个新的二进制数。左移运算有以下特点:

  • 在左移过程中,最高位的进位被保留,低位溢出舍弃。
  • 左移n位相当于将原数乘以$2^n$。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83

int g = a << 2;     // 对a进行左移2位,得到的结果是0b101001100,等价于十进制的332
右移运算(>>)

右移运算是指将一个二进制数的所有位向右移动若干位得到的结果是一个新的二进制数。右移运算有以下特点:

  • 在右移过程中,最低位的舍去,最高位(符号位)减小n位。
  • 右移n位相当于将原数除以$2^n$,只保留商的整数部分。
int a = 0b1010011;  // 二进制表示的数,等价于十进制的83

int h = a >> 2;     // 对a进行右移2位,得到的结果是0b00101001,等价于十进制的20
位操作的技巧

位操作有很多有用的技巧,下面介绍其中一些。

判断奇偶性

利用与运算可以轻松地判断一个数是奇数还是偶数。任何偶数的二进制数的最低位都是0,而任何奇数的二进制数的最低位都是1。

int a = 83;

if (a & 1) {
    cout << "奇数" << endl;
} else {
    cout << "偶数" << endl;
}
交换变量

利用异或运算,可以轻松地交换两个变量的值。这是因为异或运算有一个特性,就是两次异或同一个数会回到原来的数。

int a = 10;
int b = 20;

a ^= b;
b ^= a;
a ^= b;

cout << a << endl;   // 输出20
cout << b << endl;   // 输出10
取绝对值

对于一个负数,可以使用取反运算和加1的方式将其转换为正数。这是因为负数在计算机中是以补码的形式存在的,其绝对值的补码就是原码取反后加1。

int a = -83;

if (a < 0) {
    a = ~a + 1;
}

cout << a << endl;   // 输出83
结论

本文介绍了位操作的基本概念和常用技巧。位操作在计算机科学和算法设计中都有广泛的应用,希望读者可以掌握这些技能,更好地应用于实践。