C语言中运算符“^”,“&”,“|”简介

03-11 1073阅读

异或(^)

       当我们开始学习编程时,我们可能很快会遇到一种被称为"异或"的运算符。异或操作符通常用符号"^"表示,它是一种位运算符,用于对两个二进制数的对应位进行比较。它的运算规则如下:

C语言中运算符“^”,“&”,“|”简介
(图片来源网络,侵删)
  • 如果两个对应位相同,结果为0。
  • 如果两个对应位不同,结果为1。

    换句话说,异或操作是在两个二进制数的对应位进行比较,并将不同的位设置为1,相同的位设置为0。除了简单的比较作用之外,异或操作还有许多有用的特性和应用场景。

    一、异或操作的基本特性

    交换律

      a^b = b^a

      异或操作满足交换律,即对于任意的两个数a和b,a异或b的结果与b异或a的结果是相等的。

    结合律

    (a^b)^c = a^(b^c)

      或操作满足结合律,即对于任意的三个数a、b和c,无论以何种顺序进行异或运算,最终的结果      是相等的。

    自反性

       a^a = 0

      任何数与自身进行异或操作的结果都是0。

    零值性

      a^0 = a

      任何数与0进行异或操作的结果都是它本身。

    二、异或操作的应用

    交换两个数的值

    使用异或操作可以交换两个变量的值,而无需使用额外的变量。这是因为异或操作具有交换律和自反性的特性。例如,对于变量a和b,可以通过以下代码交换它们的值:

    a = a ^ b;

    b = a ^ b;

    a = a ^ b;

    在这个代码片段中,首先将a与b进行异或操作,并将结果赋给a。然后将该结果与b再次进行异或操作,并将结果赋给b。最后,再将a与b进行异或操作,并将结果赋给a。这样就成功地实现了A和B的值交换。

          参考链接:http://t.csdnimg.cn/ZYqqQ

    检测出现奇数次的元素

    在一个数组中,如果除了一个元素之外,所有的元素都出现偶数次,那么可以使用异或操作找出这个出现奇数次的元素。将数组中的所有元素进行异或操作,最终得到的结果就是只出现一次的元素。这是因为偶数次的元素经过异或操作会被抵消为0,最终只剩下出现奇数次的元素。

    #include 
    int findOddElement(int arr[], int n) {
        int result = 0;
        for (int i = 0; i  
     
    

    判断两个数是否相等

    使用异或操作可以判断两个数是否相等。如果两个数相等,那么它们的二进制表示的每一位都是相同的,那么进行异或操作之后的结果就是0。因此,通过判断两个数的异或结果是否为0,我们可以确定它们是否相等。

    #include 
    int areEqual(int a, int b) {
        return a ^ b; // 如果a和b相等,结果为0;如果不相等,结果非零
    }
    int main() {
        int num1 = 10;
        int num2 = 10;
        if (areEqual(num1, num2) == 0) {
            printf("%d and %d are equal.\n", num1, num2);
        } else {
            printf("%d and %d are not equal.\n", num1, num2);
        }
        return 0;
    }
    

    位运算

    异或操作也被广泛应用于位运算中,例如对于给定一个二进制数,我们可以使用异或操作来进行位反转、位清零等操作。

    总结:

    异或操作是一种基本的位运算符,具有许多特性和应用场景。它可以用于交换两个变量的值、检测出现奇数次的元素、判断两个数是否相等等。在位运算中,异或操作也发挥着重要的作用。希望通过本文对异或操作有了更深入的了解,并能在编程中灵活应用它。

    按位与(&)

           当我们学习编程时,我们经常会遇到位运算符,其中之一就是"按位与"运算符。按位与运算符通常用符号"&"表示,它对两个二进制数的对应位进行与操作。它的运算规则如下:

    •   对于两个对应位,只有当两个位都为1时,结果位才为1;否则,结果位为0。

      换句话说,按位与操作是将两个二进制数的对应位进行比较,并将相同位上的值保留下来,不同位上的值置为0。除了简单的比较作用之外,按位与操作还有许多有用的特性和应用场景。

      一、按位与操作的基本特性

      零值性

          a & 0 = 0

         对任意整数a进行按位与操作,结果都为0。

      自反性

         a & a = a

         将任何数与自身进行按位与操作,结果与自身相等。

      清零操作

        a & (-1) = a

        将任何数与全为1的二进制表示进行按位与操作,结果不变。

      二、按位与操作的应用

      清零特定位

      按位与操作常用于清零一个整数的特定位。可以使用一个适当的掩码(mask),将需要清零的位对应位置为0,然后与原值进行按位与操作。掩码是一个具有特定位模式的数,其中位模式上为1的位代表需要保留的位,为0的位代表需要清零的位。

      例如,假设有一个整数num,我们想要清零它的第3位,可以使用以下代码:

      #include 
      int clearBit(int num, int pos) {
          int mask = ~(1 > pos) & 1;
      }
      int main() {
          int num = 23; // 假设要提取的整数为23
          int pos = 3;  // 要提取的位为第4位,由于位的编号从0开始,所以这里的pos为3
          int bitValue = getBit(num, pos);
          printf("The value of the %dth bit is: %d\n", pos, bitValue);
          return 0;
      }
      

      这样就得到了num的第4位的值。

      判断奇偶性

      奇偶数的二进制表示的最后一位是不同的。利用按位与操作,我们可以判断一个整数的奇偶性。如果一个整数num与1进行按位与操作的结果为0,那么num就是偶数;如果结果为1,那么num就是奇数。

      例如,可以使用以下代码判断一个整数的奇偶性:

      #include 
      int isOdd(int num) {
          return num & 1;
      }
      int main() {
          int num = 10; // 假设要判断的整数为10
          if (isOdd(num)) {
              printf("%d is an odd number.\n", num);
          } else {
              printf("%d is an even number.\n", num);
          }
          return 0;
      }
      

      这样就可以根据按位与操作的结果判断num的奇偶性。

      总结:

      按位与操作是一种常用的位运算符,它可以用于清零特定位、提取特定位以及判断奇偶性等。在编程中,掌握按位与操作的基本特性和应用场景,能够灵活地应用它来解决各种问题。希望通过本文对按位与操作有了更深入的了解,并能在编程中灵活应用它。

      当讨论按位与操作时,让我们考虑一些具体的二进制示例,以更清楚地说明按位与操作的原理和应用。

      示例1:清零特定位

      假设我们有一个二进制数 ,我们想要清零它的第4位(从右往左,从0开始计数)。11011010

      原数:   11011010

      掩码:   11101111  (第4位为0,其他位为1)

      结果:   11001010

      使用按位与操作,我们可以将原数的第4位清零,得到结果 。11001010

      在C语言中,可以使用以下代码来实现这个操作:

      int num = 0b11011010;   // 二进制表示法
      int mask = ~(1 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]