位运算
概念
现代计算机中,所有数据都以二进制形式存储,即 0 和 1 两种状态。计算机对二进制数据进行的运算(如加、减、乘、除)被称为位运算,即对二进制数的每一位进行操作的运算。
例如下
35: 0010 0011
47: 0010 1111
----------------
82: 0101 0010
类型
& 与 两个位都为1时,结果才为1
| 或 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,高位补0或符号位补齐
不同长度的数据进行位运算:如果两个不同长度的数据进行位运算,系统会将二者按右端对齐,然后进行位运算。
复合赋值位运算符
和 += , -= 等运算符类似,位运算也有复合赋值运算符: &= , |= , ^= , <<= , >>= 。(取反是单目运算,所以没有。)
- a |= b:将变量 a 的值与变量 b 的值进行按位或操作,并将结果赋值给 a。
- a &= b:将变量 a 的值与变量 b 的值进行按位与操作,并将结果赋值给 a。
- a ^= b:将变量 a 的值与变量 b 的值进行按位异或操作,并将结果赋值给 a。
示例
#include <stdio.h>
int main()
{
char s = 10;
char b = 2;
printf("%d\n",s);
printf("%d\n", b);
s ^= b;
printf("%d\n",s);
printf("%d\n\a",b);
}
输出:
10
2
8
2
单目运算,就是只有一个操作数的运算符,即一元运算符。(常见”++”,”–”,”!”)
注意
在C/C++中,位运算的操作数必须是整数类型,不能是浮点数类型。
char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。
优先级
- 按位取反(~)优先级最高。
- 左移(<<)和右移(>>)优先级次之。
- 按位与(&)。
- 按位异或(^)。
- 按位或(|)优先级最低。
位运算的优先级总体上低于算术运算、关系运算、逻辑运算等
在实际使用中如果对优先级不确定,可以使用括号来明确运算顺序,以避免产生错误的结果。
- 标题: 位运算
- 作者: 404joker404
- 创建于 : 2024-10-01 11:42:14
- 更新于 : 2024-10-01 12:29:03
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论