• 按位运算符、逻辑运算符


    按位运算

    运算符描述
    &按位与运算符:如果两个相应位都为1,则该位的结果为1,否则为0
    |按位或运算符:只要对应的两个二进位有一个为1时,结果位就为1
    ^按位异或运算符:当两对应的二进位相异时,结果为1
    ~按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1
    <<左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0
    >>右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数

    按位运算符

    按位与

    按位与运算符 & 是二进制位运算符,用于对两个数的每个对应二进制位进行与操作。它的规则是,如果两个相应位都为 1,则结果为 1;否则,结果为 0。

    例如,假设有两个二进制数 A 和 B:

    A: 1101
    B: 1010
    
    • 1
    • 2

    按位与操作: A & B

       1101
     & 1010
     -------
       1000
    
    • 1
    • 2
    • 3
    • 4

    因此,1101 & 1010 的结果为 1000。这个规则适用于每一对相应的二进制位。

    按位或

    按位或运算符 | 是二进制位运算符,用于对两个数的每个对应二进制位进行或操作。它的规则是,如果两个相应位中至少有一个为 1,则结果为 1;只有两个相应位都为 0 时,结果为 0。

    例如,假设有两个二进制数 A 和 B:

    A: 1101
    B: 1010
    
    • 1
    • 2

    按位或操作: A | B

       1101
     | 1010
     -------
       1111
    
    • 1
    • 2
    • 3
    • 4

    因此,1101 | 1010 的结果为 1111。这个规则适用于每一对相应的二进制位。

    按位异或

    按位异或运算符 ^ 是二进制位运算符,用于对两个数的每个对应二进制位进行异或操作。异或的规则是,如果两个相应位相同(都是 0 或都是 1),则结果为 0;如果两个相应位不同(一个是 0,另一个是 1),则结果为 1。

    例如,假设有两个二进制数 A 和 B:

    A: 1101
    B: 1010
    
    • 1
    • 2

    按位异或操作: A ^ B

       1101
     ^ 1010
     -------
       0111
    
    • 1
    • 2
    • 3
    • 4

    因此,1101 ^ 1010 的结果为 0111。这个规则适用于每一对相应的二进制位。

    按位取反

    按位取反运算符 ~ 是一个一元运算符,用于对一个数的每个二进制位取反,即将 0 变为 1,将 1 变为 0。

    例如,假设有一个二进制数 A:

    A: 1101
    
    • 1

    按位取反操作: ~A

       1101
     -------
       0010
    
    • 1
    • 2
    • 3

    因此,~1101 的结果为 0010。这个规则适用于每个二进制位。请注意,由于计算机使用补码表示负数,因此取反的结果可能会有一些意想不到的效果,具体取决于数据类型和编程语言的规则。

    移位

    左移位运算符 << 和右移位运算符 >> 是用于对二进制数进行位移操作的。

    • 左移位运算符 (<<):将一个数的二进制表示向左移动指定的位数,右侧空出的位用 0 填充。语法:a << n,其中 a 是要进行左移的数,n 是左移的位数。

      例如,5 << 2 表示将二进制数 5 向左移动两位:

      5 (二进制: 00000101)
      左移两位后: 00010100
      结果为 20
      
      • 1
      • 2
      • 3
    • 右移位运算符 (>>):将一个数的二进制表示向右移动指定的位数,左侧空出的位用原先最高位的值填充(有符号数用符号位填充,无符号数用 0 填充)。语法:a >> n,其中 a 是要进行右移的数,n 是右移的位数。

      例如,16 >> 2 表示将二进制数 16 向右移动两位:

      16 (二进制: 00010000)
      右移两位后: 00000004
      结果为 4
      
      • 1
      • 2
      • 3

    这两个运算符常用于对数据进行位级操作,例如,对于一些底层的位级编程需求。

    配置寄存器

    配置寄存器的按位与(AND)和按位或(OR)操作通常用于对寄存器的特定位进行设置或清除,以达到配置硬件状态的目的。

    按位与操作

    按位与操作用于将寄存器的特定位设置为指定的值,而不影响其他位。操作的基本形式是使用一个掩码,其中掩码的每个位都是希望保留的位,其余位设为 0。然后,使用按位与运算符将掩码应用于寄存器。这将清除掉掩码中设为 0 的那些位。

    例如,如果我们有一个寄存器 reg,我们希望将其第 3 位设置为 1,可以执行以下操作:

    reg = reg | (1 << 2);  // 将第 3 位设为 1,使用按位或
    
    • 1

    上述操作中,1 << 2 创建了一个二进制数 00000100,然后使用按位或将其与寄存器 reg 相结合。

    按位或操作

    按位或操作用于将寄存器的特定位设置为 1,而不影响其他位。操作的基本形式是使用一个掩码,其中掩码的每个位都是希望设置为 1 的位,其余位设为 0。然后,使用按位或运算符将掩码应用于寄存器。这将把掩码中设为 1 的那些位设置为 1,而保留其他位不变。

    例如,如果我们有一个寄存器 reg,我们希望将其第 4 位设置为 1,可以执行以下操作:

    reg = reg | (1 << 3);  // 将第 4 位设为 1,使用按位或
    
    • 1

    上述操作中,1 << 3 创建了一个二进制数 00001000,然后使用按位或将其与寄存器 reg 相结合。

    总体而言,这些按位运算是对寄存器进行底层配置的有力工具,使得可以针对需要的位进行灵活的设置和清除。

    掩码

    掩码是一个用于按位操作的二进制数,它的作用是选择性地启用或禁用其他二进制数的特定位。在实际编程中,掩码通常通过使用按位左移和按位或运算符来创建。

    按位左移操作

    按位左移操作是将二进制数向左移动指定的位数。左移操作符是 <<,其形式为 x << n,其中 x 是要移动的二进制数,n 是左移的位数。左移相当于在原始二进制数的右侧附加 n 个零。

    按位或操作

    按位或操作是将两个二进制数的每个对应位进行逻辑或运算。按位或操作符是 |,其形式为 x | y,其中 xy 是进行按位或运算的两个二进制数。

    创建掩码的一般步骤如下:

    1. 使用按位左移操作创建一个包含特定位的二进制数,将需要设置或清除的位设置为 1。
    2. 使用按位或操作将掩码与其他二进制数结合,以选择性地启用或禁用特定位。

    例如,假设我们有一个 8 位的寄存器,我们想要设置第 3 位和第 5 位。我们可以使用以下步骤:

    // 创建掩码,将第 3 位和第 5 位设置为 1
    int mask = (1 << 2) | (1 << 4);
    
    // 使用按位或将掩码应用于寄存器 reg
    reg = reg | mask;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述代码中,(1 << 2)(1 << 4) 分别创建了二进制数 0000010000010000,然后按位或操作符将它们结合成掩码 00010100。最后,通过将这个掩码与寄存器 reg 进行按位或操作,我们可以选择性地设置第 3 位和第 5 位。

    逻辑运算符

    逻辑运算符用于执行逻辑运算,常见的有与(AND)、或(OR)、非(NOT)三种。这些运算符通常用于布尔类型的操作数。下面分别讨论这三种逻辑运算符的含义:

    1. 逻辑与(AND)操作符 &&

      • 含义: 如果两个操作数都为 True,则结果为 True;如果其中一个或两个操作数为 False,则结果为 False
      • 示例: True && False 的结果为 False
    2. 逻辑或(OR)操作符 ||

      • 含义: 如果两个操作数至少有一个为 True,则结果为 True;如果两个操作数都为 False,则结果为 False
      • 示例: True || False 的结果为 True
    3. 逻辑非(NOT)操作符 !

      • 含义: 对一个操作数取反,如果操作数为 True,则结果为 False;如果操作数为 False,则结果为 True
      • 示例: !True 的结果为 False

    这些逻辑运算符通常用于条件判断,控制程序的执行流程。在某些编程语言中,逻辑运算符具有短路求值的特性,即如果第一个操作数已经确定了整个表达式的结果,就不再计算第二个操作数。这可以提高程序的性能,尤其是在处理复杂条件表达式时。

    条件与

    在编程中,“条件与” 通常指的是逻辑运算符 “&&”(与运算符)。“条件与” 表达式的含义是,当且仅当所有条件都为真(True)时,整个表达式的结果才为真。

    例如,在C、C++、Java等编程语言中,可以使用 “&&” 来表示 “条件与”。下面是一个示例:

    #include 
    
    int main() {
        int a = 5;
        int b = 10;
    
        // 条件与表达式
        if (a > 0 && b > 0) {
            printf("Both a and b are greater than 0.\n");
        } else {
            printf("At least one of them is not greater than 0.\n");
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这个示例中,a > 0 && b > 0 表达式中的 “&&” 表示 “条件与”,只有当 a 大于 0 且 b 大于 0 时,整个表达式的值为真,程序会输出 “Both a and b are greater than 0.”。如果其中一个条件不满足,那么整个表达式的值为假,程序会输出 “At least one of them is not greater than 0.”。

    “条件与” 在控制结构中经常用于需要多个条件同时满足时的情况,比如在 if 语句中。

    条件或

    条件或通常指的是逻辑运算符 “||”(或运算符)。“条件或” 表达式的含义是,当至少一个条件为真(True)时,整个表达式的结果就为真。

    在C、C++、Java等编程语言中,可以使用 “||” 来表示 “条件或”。下面是一个示例:

    #include 
    
    int main() {
        int a = 5;
        int b = 10;
    
        // 条件或表达式
        if (a > 0 || b > 0) {
            printf("At least one of them is greater than 0.\n");
        } else {
            printf("Both a and b are not greater than 0.\n");
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这个示例中,a > 0 || b > 0 表达式中的 “||” 表示 “条件或”,只要 a 大于 0 或者 b 大于 0,整个表达式的值为真,程序会输出 “At least one of them is greater than 0.”。只有当两个条件都不满足时,整个表达式的值为假,程序会输出 “Both a and b are not greater than 0.”。

    “条件或” 在控制结构中经常用于需要满足多个条件中的至少一个时的情况,比如在 if 语句中。

    条件非

    “条件非” 通常指的是逻辑运算符 “!”(非运算符)。“条件非” 表达式的含义是,当给定的条件为假(False)时,整个表达式的结果为真(True),反之亦然。

    在C、C++、Java等编程语言中,可以使用 “!” 来表示 “条件非”。下面是一个示例:

    #include 
    
    int main() {
        int a = 5;
    
        // 条件非表达式
        if (!(a > 0)) {
            printf("a is not greater than 0.\n");
        } else {
            printf("a is greater than 0.\n");
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这个示例中,!(a > 0) 表达式中的 “!” 表示 “条件非”,如果 a 不大于 0,整个表达式的值为真,程序会输出 “a is not greater than 0.”;反之,如果 a 大于 0,整个表达式的值为假,程序会输出 “a is greater than 0.”。

    “条件非” 经常用于需要检查某个条件是否不成立的情况,比如在 if 语句中。

  • 相关阅读:
    常用消息中间件简介
    基于JSP和MySQL实现的易买网电商网站设计
    flyway7.1.1适配人大金仓postgres版本
    OSPF虚拟链路以及选路
    拉链法和开放寻址法 c++实现
    SparkCore系列-9、共享变量
    苹果Mac电脑fcpx视频剪辑:Final Cut Pro中文最新 for mac
    【NodeJs篇】在项目中如何操作MYSQL?
    互联网摸鱼日报(2023-09-06)
    从0开始的异世界编程 [3]
  • 原文地址:https://blog.csdn.net/m0_62140641/article/details/134424289