📅  最后修改于: 2023-12-03 15:22:33.829000             🧑  作者: Mango
位操作是计算机科学中很重要的一个概念,它常常用于处理二进制数据。在本文中,我们将深入探讨位操作的各种用途和技巧。
在开始探索位操作之前,我们需要了解一些基本概念。C++中共有六个位运算符,它们分别是:
&
与运算|
或运算^
异或运算~
取反运算<<
左移运算>>
右移运算这些运算符通常用于处理整数类型变量的二进制表示。接下来,我们将一一介绍它们的用途。
与运算是指将两个二进制数按位进行与操作,得到的结果是一个新的二进制数。与运算有以下特点:
int a = 0b1010011; // 二进制表示的数,等价于十进制的83
int b = 0b1111000; // 二进制表示的数,等价于十进制的120
int c = a & b; // 对a和b进行与运算,得到的结果是0b1010000,等价于十进制的80
或运算是指将两个二进制数按位进行或操作,得到的结果是一个新的二进制数。或运算有以下特点:
int a = 0b1010011; // 二进制表示的数,等价于十进制的83
int b = 0b1111000; // 二进制表示的数,等价于十进制的120
int d = a | b; // 对a和b进行或运算,得到的结果是0b1111011,等价于十进制的123
异或运算是指将两个二进制数按位进行异或操作,得到的结果是一个新的二进制数。异或运算有以下特点:
int a = 0b1010011; // 二进制表示的数,等价于十进制的83
int b = 0b1111000; // 二进制表示的数,等价于十进制的120
int e = a ^ b; // 对a和b进行异或运算,得到的结果是0b0101011,等价于十进制的43
取反运算是指对一个二进制数的所有位进行取反操作,得到的结果是一个新的二进制数。取反运算有以下特点:
int a = 0b1010011; // 二进制表示的数,等价于十进制的83
int f = ~a; // 对a进行取反操作,得到的结果是0b11111111111111111111111101011000,等价于十进制的-84
左移运算是指将一个二进制数的所有位向左移动若干位得到的结果是一个新的二进制数。左移运算有以下特点:
int a = 0b1010011; // 二进制表示的数,等价于十进制的83
int g = a << 2; // 对a进行左移2位,得到的结果是0b101001100,等价于十进制的332
右移运算是指将一个二进制数的所有位向右移动若干位得到的结果是一个新的二进制数。右移运算有以下特点:
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
本文介绍了位操作的基本概念和常用技巧。位操作在计算机科学和算法设计中都有广泛的应用,希望读者可以掌握这些技能,更好地应用于实践。