按位与

按位与是按二进制位与,比较两个二进制位数,如果上下同为0则为0,如果一个为1,一个为0则为0,如果同时为1则为1.

例:a=5,b=1,

a的二进制数为00000000 00000000 00000000 00000101

b的二进制数为00000000 00000000 00000000 00000001

则c=a&b的二进制数为00000000 00000000 00000000 00000001为1,因为倒数第三个数只有a为1,b为0,所以与的话就是0,倒数第二个数a和b都是0,所以结果就是0,倒数第一个数两个都为1,所以结果为1,最终的值就是前面31个是0,最后1个是1,对应的十进制数就是1.所以c=1

按位或

按位或是按照二进制位或,比较两个二进制数,如果上下两个同为0,则为0,如果一个为1,一个为0,则结果为1,如果都是1则为1.

例:a=5,b=1,

a的二进制数为00000000 00000000 00000000 00000101

b的二进制数为00000000 00000000 00000000 00000001

则c=2|b的二进制数为00000000 00000000 00000000 00000101,因为倒数第三个数中a的值为1,b的值为0,所以结果是1,倒数第二个数同为0,所以结果为0,倒数第一个数同为1,所以结果为1,最终就是前面29个为0,然后是101.所以c=5

按位异或

按位异或是按照二进制位异或,比较两个二进制数,如果上下两个数相异则为1,相同则为0.

例:a=3,b=5;

a的二进制数为00000000 00000000 00000000 00000011

b的二进制数为00000000 00000000 00000000 00000101

则c=a^b的二进制数为00000000 00000000 00000000 00000110,因为倒数第三个数和倒数第二个数的上下两个值要么是0,1要么是1,0,是相异的,所以结果为1,,倒数第一个数上下两个数都为1,是相同的,所以结果为0,最终的结果就是前面29为都为1,后三位是110,所以c=6

面试变态题:不使用临时变量交换两个数的值,如a=5,b=3,不设临时变量使得a=3,b=5.

源程序:

#include <stdio.h>
int main()
{
    int a = 5;
    int b = 3;
    printf("a=%d,b=%d\n", a, b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d,b=%d\n", a, b);
}

这道题目其实就是一种按位异或的使用方式,首先设立a和b然后输出它们的值,之后让a和b按位异或一下,结果赋给a,就是a的后三位是110,b的后三位不变,还是011,再让a和b按位异或一下,结果值为101,就是5,赋给b,a的值还是110,b的值已经是101了,最后再让a和b安按位异或一下得到的结果为011,结果赋给a,最终得到的a=011,b=101,就是a=3,b=5,然后输出。通过使用按位异或的方式就可以不使用临时变量即可达到交换两个不相同数的目的。

总结:a与b按位异或得到的二进制位数肯定是a与b的相异为1,相同为0,所以把这个二进制数再去和b按位异或一下,得到的就是相同为0,相异为1,得到的就是a的值,赋给b,就达到了把a的值赋给b的目的,再把一开始按位异或的值和转换过后的b值按位异或,得到的值再赋值给a,就可以得到b的值,从而把b的值赋给了a,因此就可以让a和b的值互换。

按位与,按位或,按位异或的理解相关推荐

  1. C语言按位与 按位或 按位异或 按位取反

    与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1| ...

  2. C语言按位与 按位或 按位异或 按位取反(二)

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

  3. C语言按位与 按位或 按位异或 按位取反 (一)

    与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1| ...

  4. 位运算符:按位与(),按位或(|),按位异或(^),取反(~)左移()和右移()

    数据在内存中是以二进制的形式存放的,计算机存储数据的最小单位是位(bit),一个二进制位可以表示两种状态(0和1),一个字节通常由8位二进制位组成.C语言支持按位运算,按位运算也就是对字节或者字中的实 ...

  5. c/c++位操作简介--移位、位与、位或、异或

    概述 C/C++里面位操作符表示为如下:左移位 << ,右移位 >>,位与 &,位或 | ,位异或 ^,按位求反~. 位操作符针对的是补码形式(可参见下面的例子,其实我 ...

  6. 位运算专题一:位与、位或、位反

    位运算只用于所有的整型!!(char,short,int,long int,long long,unsigned char,unsigned short......),浮点值均不适用!!! 位运算有哪 ...

  7. 位与()、位或(|)、异或(^) 、左移<<、右移>>、原码、反码、补码的简单应用

    一.位与(&).位或(|).异或(^) 1.位与运算(&):两位同时为1,结果才为1,否则为0 参加运算的两个数据,按二进制位进行"&"运算. 运算规则:0 ...

  8. sql位运算符【(位与)、~(位非)、|(位或)、^(位异或)】与位移

    1.&(位与) 上下运算,按照与的运算规则:0&0=0 :0&1=0:1&1=1 例如: 170 & 75 结果为:0000 0000 0000 1010 再把 ...

  9. |,^,(按位或,按位异或,按位与)

    | 按位或:    参与运算的两数各对应的二进位相或.只要对应的二个二进位有一个为1时,结果位就为1         例如: 1|2 : 0001 | 0010 = 0011             ...

最新文章

  1. android 点击事件消费,Android View事件分发和消费源码简单理解
  2. java z注释过滤_如何编写一个java程序来过滤所有注释行并只打印java编码行?
  3. 云炬Android开发笔记 16附加功能开发(二维码,一键分享,分页,搜索)
  4. 自定义报表预览控制工具条
  5. uva 10635 Prince and Princess(LCS成问题LIS问题O(nlogn))
  6. c语言陷阱试题,超级经典计算机二级C语言陷阱考试题.doc
  7. 刷题到底有什么用?你这么刷题还真没用
  8. 图解PCB板元器件焊接流程
  9. python秒表代码_斌哥教你自制千分秒表(键盘控制)
  10. 思科警告:这个 IOS XR 0day 已遭利用,目前尚无补丁
  11. IT人终于把自己熬成了民工
  12. ELK官方文档收集Kibana监视数据编辑
  13. 机器学习的开源工具-开源程序-研究工具
  14. JRuby--Java和Ruby的强强联合 Centos7.X
  15. 整合并接班MSN!Win8版Skype完全体验
  16. 矩阵分解:特征值分解、SVD分解、舒尔分解、谱分解
  17. U盘文件被隐藏后的修复方法
  18. winzip15.0注冊码
  19. 宠物商店项目mysql_北大青鸟java宠物商店+MySQL数据库
  20. 用宝塔面板网站php变成静态,宝塔面板可以建立静态网站吗?如何部署一个静态页面?...

热门文章

  1. 盛迈坤电商:店铺主营类目怎么样选择
  2. 关于GPT、AI绘画、AI提词器等AI技术的探讨
  3. 国产Excel开发组件Spire.XLS【转换】教程(5):#/将特定工作表单元格转换为图像
  4. 跟着团子学SAP PS:SAP PS与第三方PMS(P6\MS Project)数据交互组件
  5. CMAB 强化学习中的组合多臂老虎机问题(二)
  6. flash编程基础的一些讲解(概念与函数)
  7. 50万亿元如何撑起“中国制造”未来
  8. 7034mysql意外停止_中国名创解决mysql数据库意外自动关闭(停止)的问题
  9. (转)关于微信小程序大多数人都搞错的八个问题
  10. php计算百分比值,请教一个计算百分比的语句