1. 基本概念 位运算: 用于对整数类型(int,char, long 等)变量中的 某一位(bit),或者若干位进行操作。比如: 1) 判断某一位是否为1 2) 只改变其中某一位,而保持其他位都不变。 C/C++语言提供了六种位运算符来进行位运算操作: & 按位与(双目) | 按位或(双目) ^ 按位异或(双目) ~ 按位非(取反)(单目) << 左移(双目) >> ...
C++中的按位运算(与、或、非)
按位与运算(&)
按位与运算就是将两个变量的各个bit进行求 与运算,然后将结果输出
按位或运算(|)
将两个变量的各个bit进行按位求或
按位异或(^)
按位取反(~)
位运算——移位(>> <<)
在c++中,经常会对具体整型数据的位进行操作。例如:要获取整数12(0B1100)在第1位上数值(为0),第2位上数值(为1),第3位上数值(为1)。在此,我使用位操作符中的“&”进行读取。
因为整数中的1,2,4,8(2^n n=0,1,2,3,4.....)用二进制表示分别为0B0001,0B0010,0B0100,0B1000,保证了只有一位为1,其余均为0的特性,可以“过滤”出特殊位置出的数值。1 int i(12); //0x1100
2 int j01 = (12 & 4) / 4; //(0x1100 &...
1的个数
解法 1:
用 n & 1 判断最右边一位是否为 1,右移之后继续判断最右边一位,重复直到 n = 0。时间复杂度为 O(log2n)
#include <iostream>
using namespace std;
int main() {int n = 0b1101, cnt = 0;while (n) {cnt += n & 1;n >>= 1;}cout << cnt << endl;return 0;
}解法 2:
用 n & (n - 1) 可以消去最右边的 1,重复直到 n = 0。时间复杂度为 O(count),取决于 1 的个数 count,所以这种方法优于第一种。
#include <io...
xor (异或)
如果a、b两个值不相同,则异或结果为1
如果a、b两个值相同,异或结果为0
技巧:
这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法
0 xor 0=0
1 xor 0=1
0 xor 1=1
1 xor 1=0(同为0,异为1)