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

知微之見發表於2023-04-12

前言

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

一、人物簡介

  • 第一位閃亮登場,有請今後會一直教我們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、求兩個數的平均數

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

?歡迎各位 ?點贊 ⭐收藏 ?評論,如有錯誤請留言指正,非常感謝!

相關文章