按位与,按位或,按位异或的理解

按位与

按位与是按二进制位与,比较两个二进制位数,如果上下同为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的值互换。

  • 28
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值