前言
在上一篇文章中,我們介紹了|
運算符的高級用法,本篇文章,我們將介紹^
運算符的一些高級用法。
一、人物簡介
- 第一位閃亮登場,有請今后會一直教我們C語言的老師 —— 自在。
- 第二位上場的是和我們一起學(xué)習(xí)的小白程序猿 —— 逍遙。
二、交換兩個變量的值
#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;
}
- 兩個相同的數(shù),異或結(jié)果為0
- 第一次的
a ^= b
等價于a = a ^ b
-
b ^= a
此時等價于b = b ^ a ^ b
,結(jié)果為b = a
- 第二次的
a ^= b
此時等價于a = a ^ b ^ a
,結(jié)果為a = b
- 這樣
a
和b
的數(shù)值就進(jìn)行了交換
三、判斷兩個變量的符號是否相同
#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;
}
- 有符號數(shù)的最高位是符號位,0表示正數(shù),1表示負(fù)數(shù)
- 如果兩個有符號數(shù)的最高位相同,則最高位異或結(jié)果為0,反之則為1
四、將一個數(shù)的某些位翻轉(zhuǎn)
#include <stdio.h>
int main()
{
unsigned int num = 12; // 0b1100
unsigned int mask = 7; // 0b0111
unsigned int result = num ^ mask; // 0b1011
printf("原始數(shù)據(jù): %u\n", num);
printf("掩碼: %u\n", mask);
printf("位翻轉(zhuǎn)后: %u\n", result);
return 0;
}
-
num
的二進(jìn)制表示為1100
,mask的二進(jìn)制表示為0111
- 從低位往高位數(shù),num和mask第三位相同,都為
1
,所以這一位的異或結(jié)果為0
- 最終的結(jié)果為
1011
五、求兩個數(shù)的平均數(shù)
#include <stdio.h>
int main()
{
int a = 15; // 0b1111
int b = 5; // 0b0101
int avg = (a&b) + ((a^b)>>1);
printf(" %d 和 %d 的平均數(shù)為 %d\n", a, b, avg);
return 0;
}
-
a
的二進(jìn)制表示為1111
,b
的二進(jìn)制表示為0101
- 按位與(&)運算后得到兩者相同的部分
0101
- 按位異或(^)運算后得到兩者不同的部分
1010
-
(a ^ b)>> 1
,等價于(a ^ b)/2
,也就是將兩者不同的部分除以2 - 相同的部分,加上二分之一不同的部分,就得到兩個數(shù)的平均數(shù)
小結(jié)
通過這篇文章,我們學(xué)會了用位運算符^
的4種高級用法
1、交換兩個變量的值
2、判斷兩個變量的符號是否相同
3、將一個數(shù)的某些位翻轉(zhuǎn)
4、求兩個數(shù)的平均數(shù)
在下一篇文章中,我們將介紹位運算符~
的一些高級用法。文章來源:http://www.zghlxwxcb.cn/news/detail-411288.html
??歡迎各位 ??點贊 ?收藏 ??評論,如有錯誤請留言指正,非常感謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-411288.html
到了這里,關(guān)于逍遙自在學(xué)C語言 | 位運算符^的高級用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!