位运算

404joker404 Lv3

概念

现代计算机中,所有数据都以二进制形式存储,即 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

Pas8.png

单目运算,就是只有一个操作数的运算符,即一元运算符。(常见”++”,”–”,”!”)

注意

在C/C++中,位运算的操作数必须是整数类型,不能是浮点数类型。

char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long都可以进行移位操作,而double、float、bool、long double则不可以进行移位操作。

优先级

  1. 按位取反(~)优先级最高。
  2. 左移(<<)和右移(>>)优先级次之。
  3. 按位与(&)。
  4. 按位异或(^)。
  5. 按位或(|)优先级最低。

位运算的优先级总体上低于算术运算、关系运算、逻辑运算等

在实际使用中如果对优先级不确定,可以使用括号来明确运算顺序,以避免产生错误的结果。

  • 标题: 位运算
  • 作者: 404joker404
  • 创建于 : 2024-10-01 11:42:14
  • 更新于 : 2024-10-01 12:29:03
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
位运算