5

逍遥自在学C语言 | 位运算符^的高级用法 - 知微之见

 1 year ago
source link: https://www.cnblogs.com/Wayne123/p/17309199.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法。

1511464-20230412111655287-94981943.png

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。
1511464-20230403100945222-934948634.gif
  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。
1511464-20230403101030223-1500558355.gif

二、交换两个变量的值

#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;
}
1511464-20230412111704055-1310344704.png
  • 两个相同的数,异或结果为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;
}
1511464-20230412111711217-1953560133.png
  • 有符号数的最高位是符号位,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;
}
1511464-20230412111718098-308604601.png
  • 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;
}
1511464-20230412111738164-923691295.png
  • a的二进制表示为1111b的二进制表示为0101
  • 按位与(&)运算后得到两者相同的部分0101
  • 按位异或(^)运算后得到两者不同的部分1010
  • (a ^ b)>> 1,等价于(a ^ b)/2,也就是将两者不同的部分除以2
  • 相同的部分,加上二分之一不同的部分,就得到两个数的平均数

通过这篇文章,我们学会了用位运算符^的4种高级用法

1、交换两个变量的值

2、判断两个变量的符号是否相同

3、将一个数的某些位翻转

4、求两个数的平均数

在下一篇文章中,我们将介绍位运算符~的一些高级用法。

📢欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,非常感谢!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK