逍遙自在學C語言 | 位運運算元^的高階用法

2023-04-12 12:00:33

前言

在上一篇文章中,我們介紹了|運運算元的高階用法,本篇文章,我們將介紹^ 運運算元的一些高階用法。

一、人物簡介

  • 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。

  • 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。

二、交換兩個變數的值

#include <stdio.h>

int main() 
{
    int a = 10;
    int b = 20;
    printf("交換前: a = %d, b = %d\n", a, b);
    a ^= b;
    b ^= a;
    a ^= b;
    printf("交換後: a = %d, b = %d\n", a, b);
    return 0;
}

  • 兩個相同的數,互斥或結果為0
  • 第一次的a ^= b 等價於 a = a ^ b
  • b ^= a 此時等價於 b = b ^ a ^ b ,結果為 b = a
  • 第二次的a ^= b 此時等價於 a = a ^ b ^ a,結果為 a = b
  • 這樣ab的數值就進行了交換

三、判斷兩個變數的符號是否相同

#include <stdio.h>

int main() 
{
    int x = 10;
    int y = -20;
    if ((x ^ y) < 0) 
    {
        printf("x 和 y符號相反\n");
    }
    else 
    {
        printf("x 和 y符號相同\n");
    }
    return 0;
}

  • 有符號數的最高位是符號位,0表示正數,1表示負數
  • 如果兩個有符號數的最高位相同,則最高位互斥或結果為0,反之則為1

四、將一個數的某些位翻轉

#include <stdio.h>
int main() 
{
    unsigned int num = 12; // 0b1100
    unsigned int mask = 7; // 0b0111
    unsigned int result = num ^ mask; // 0b1011 
    printf("原始資料: %u\n", num);
    printf("掩碼: %u\n", mask);
    printf("位翻轉後: %u\n", result);
    return 0;
}

  • num的二進位制表示為1100,mask的二進位制表示為0111
  • 從低位往高位數,num和mask第三位相同,都為1,所以這一位的互斥或結果為0
  • 最終的結果為1011

五、求兩個數的平均數

#include <stdio.h>
int main()
{
  int a = 15;	// 0b1111
  int b = 5;	// 0b0101
  int avg = (a&b) + ((a^b)>>1);
  printf(" %d 和 %d 的平均數為 %d\n", a, b, avg);
  return 0;
}

  • a的二進位制表示為1111b的二進位制表示為0101
  • 按位元與(&)運算後得到兩者相同的部分0101
  • 按位元互斥或(^)運算後得到兩者不同的部分1010
  • (a ^ b)>> 1,等價於(a ^ b)/2,也就是將兩者不同的部分除以2
  • 相同的部分,加上二分之一不同的部分,就得到兩個數的平均數

小結

通過這篇文章,我們學會了用位運運算元^的4種高階用法

1、交換兩個變數的值

2、判斷兩個變數的符號是否相同

3、將一個數的某些位翻轉

4、求兩個數的平均數

在下一篇文章中,我們將介紹位運運算元~的一些高階用法。