前言

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

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们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. Stram流 - 随笔

    函数式编程 注重函数 - 关注对数据进行了什么操作 流 中间操作 去重 authors.stream() .distinct() ; 查询指定匹配 .filter(new Predicate<A ...

  2. 为什么reids是单线程

    我们首先要明白,reids很快,官方表示,因为reids是基于内存的操作,cpu不是reids的瓶颈,redis的瓶颈有可能是机器内存的大小或者网络带宽,既然单线程容易控制,而且cpu不会成为瓶颈,所 ...

  3. 跨域请求 jQuery的ajax jsonp的使用

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  4. Excel 去除合并并保留原值的办法

    部分Excel中,对行进行了合并.这个方便展示,但是筛选后数据展示会出现问题,需要去除合并,并在每行中保留原来的值. 1.先选择整行,并"取消单元格合并" 操作后出现大量的空值行. ...

  5. protobuf怎么处理java中的Object和Object[],protobuf的bytestring和object[]

    如题,作者一开始也遇到了这个比较棘手的问题. 话不多说,直接说解决方案. 这里使用bytestring,如果是object[]的话则用repeated定义即可. 那么问题又来了,用这个类型怎么做到与j ...

  6. 简介及spring mvc初体验

    一.C\S和B\S C/S C/S 是 Client/Server 的简写,简称客户端/服务器模式.例如 QQ 是客户端和服务器模式,首先安装一个客户端到个人电脑,然后登入到腾讯服务器. 缺点:更新不 ...

  7. Exception processing template "index": An error happened during template rendering

    问题所在 brandList[0].brandId出错,要不就改正,要不就把他删了,注释也会报错.

  8. mysql使用support-files下的mysql.server启动报错“Starting MySQL ERROR! Couldn't find MySQL server (/usr/local/mysql/bin/mysqld_safe)”

    报错版本:mysql-5.7.35 1.报错完整提示信息: [root@localhost support-files]# ./mysql.server start ./mysql.server: l ...

  9. gogetssl申请的域名证书私钥文件丢了,可以重新申请个吗?

    因为gogetssl是不保存我们使用浏览器生成的KEY文件的,CSR文件倒是可以有办法再找到 也就是说Certificate Signing Request(CSR)可以想想办法,但是Your Pri ...

  10. 讨论django并发能力及提供并发解决方案

    django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发 nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地 ...