前言

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

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们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、求两个数的平均数

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

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

逍遥自在学C语言 | 位运算符^的高级用法的更多相关文章

  1. C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  2. C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  3. Flask - 模板语言jinja2 和render_template高级用法

    目录 Flask - 模板语言jinja2 和render_template高级用法 一. 字典传递至前端 二. 列表传入前端Jinja2 模板的操作: 三. 大字典传入前端 Jinja2 模板 四. ...

  4. 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...

  5. c语言位运算符

    C语言既具有高级语言的特点,又具有低级语言的功能. 所谓位运算是指进行二进制位的运算. C语言提供的位运算: 运算符   含义  &   按位与  |   按位或  ∧   按位异或  ∽   ...

  6. C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型 ...

  7. C语言位运算符详解

    原文链接:https://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题 ...

  8. 基础知识复习(一)——C语言位运算符详解

    常用的位运算符:与(&),取反(~),或(|),异或(^),左移(«),右移(») 1. 与(&)操作符,按位与,全为1 时,结果取1 11001 &10011 结果:1000 ...

  9. C语言--位运算符

    一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010,  7用二进制表示为0111.对两个数值进行&a ...

  10. C#位运算符的基本用法

    位运算符包括:| 按位或 OR,& 按位与 AND,^ 按位异或 XOR,~ 取反 NOT,<< 左移 Left Shift,>> 右移 Right Shift,等等. ...

随机推荐

  1. 测试Lock锁

    package com.company;import java.util.concurrent.locks.ReentrantLock;//测试Lock锁public class TestLock i ...

  2. 照亮体育馆 Barisal Stadium

    UVA10641 题目为逆时针顺序编号,这里直接将数组开两倍来处理环.(然而不知为啥开到1000也能过) 定义: Corners[i]Corners[i]Corners[i]为体育馆点的坐标. Lig ...

  3. 原来sed不支持非贪婪匹配

    场景 从GISAID上面批量下载下来的序列id很长,格式如下: 太长了,并且makeblastdb的时候-parse_seqids参数会导致报错,大概是长度太长不符合要求无法处理之类的. 不作处理去掉 ...

  4. JS样式获取的封装方法

    样式获取 style属性 只能获取标签内容style属性里面存在的一些样式 如果你需要获取对应的全局所有地方设置样式 我们就需要采用一些方法 getComputedStyle 方法属于window的方 ...

  5. Halcon代码导出到.net FrameWork/WPF

    1. 应用背景 在工业项目中,往往需要使用机器视觉结合人机界面开发特定的,面向工艺的项目.机器视觉中,Halcon无疑是功能强大的,能快速应用到项目的视觉产品,而WPF则是解决人机界面的利器.因此了解 ...

  6. USB 驱动框架分析

    这里先说一些概念性的东西,了解一下USB 一.关于usb设备 都见过很多,用过很多了,每当我们插上一个usb设备到pc的时 右下角就会弹出一个提示信息,提示"发现xxx"设备,再接 ...

  7. HBase启动HMaster闪退

    1.问题描述 (1)HBase启动 [Hadoop@master conf]$ start-hbase.sh SLF4J: Class path contains multiple SLF4J bin ...

  8. Python使用Eel和HTML开发桌面应用GUI直接用web前端的VUE+VANT来做

    python的gui太难用了,唯一能配置独立前端的程序只有web.所以用web做前端,到python,完美! 环境准备    Python 3.9    Chrome浏览器(由于Eel是直接调用的Ch ...

  9. 什么是5G垂直行业?

    什么是垂直行业呢? 感觉"垂直行业"这个词在太多地方遇到,但是这个词的涵盖范围到底是什么呢? 垂直这一概念源于两条直线(或平面)的直角交叉,两条直线是相互作为参照物的.比如,我们可 ...

  10. spring boot 上传文件大小超出限制

    查看源码如下: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration 可以看见调用了Multipa ...