一、位运算基础概念
计算机中的数据以二进制形式存储,每一个数据位(bit)只能表示0或1两种状态。位运算就是直接对这些二进制位进行操作的运算,它不关心数据的具体类型(如整数、字符等),而是专注于二进制位的组合和变换。
在进行位运算时,通常会涉及到操作数和操作符。操作数是参与运算的数据,而操作符则定义了具体的运算规则。不同的编程语言对位运算的支持略有差异,但基本的操作符和运算逻辑是相通的。
二、常见位运算操作符
1. 按位与(&)
按位与操作符 & 对两个操作数的每一位进行比较,如果对应位都为1,则结果位为1,否则为0。
/*与运算 &
以 5 7为例
0101(5的二进制)
0111(7的二进制)
0101(&的结果)
*/
int a=5;
int b=7;
cout<<(a&b)<<endl;
2. 按位或(|)
按位或操作符 | 对两个操作数的每一位进行比较,如果对应位至少有一个为1,则结果位为1,否则为0。
/*或运算 |
以 5 7为例
0101(5的二进制)
0111(7的二进制)
0111(|的结果)
*/
int a=5;
int b=7;
cout<<(a|b)<<endl;
3. 按位异或(^)
按位异或操作符 ^ 对两个操作数的每一位进行比较,如果对应位不同,则结果位为1,否则为0。
/*异或运算 ^ (无进位相加)
以 5 7为例
0101(5的二进制)
0111(7的二进制)
0010(^的结果)
*/
int a=5;
int b=7;
cout<<(a^b)<<endl;
4. 按位取反(~)
按位取反操作符 ~ 对操作数的每一位进行取反(0变1,1变0)。需要注意的是,取反操作后结果会根据计算机的补码规则进行转换。
/*取反运算 ~
以 5 为例
0101(5的二进制)
1010(~的结果)
*/
int a=5;
cout<<(~a)<<endl;
5. 左移(<<)
左移操作符 << 将操作数的二进制位向左移动指定的位数,右侧空位补0。左移操作相当于对数值乘以2的幂次方。例如:
/*左移运算 <<
以5为例
0101(5的二进制)
1010(<<的结果)
*/
int a=5;
cout<<(a<<1)<<endl;
6. 右移(>>)
右移操作符 >> 将操作数的二进制位向右移动指定的位数,左侧空位根据符号位填充(正数补0,负数补1)。右移操作相当于对数值除以2的幂次方并向下取整。
/*右移运算 >>
以5为例
0101(5的二进制)
0010(>>的结果)
*/
int a=5;
cout<<(a>>1)<<endl;
总结
位运算是计算机底层的重要操作方式,掌握位运算可以帮助我们编写出更高效、简洁的代码。