c++中的运算符异或^,与&,或|

& :只有2个都为1,那么结果是1,否则为0;例如:1&1=1,1&0=0,0&0=0,0&1=0;

11 & 3 = 3

   00001011
&  00000011
=  00000011 = 3

| :只要有一个是1,那么结果为1,否则为0;例如:1&1=1,1&0=1,0&0=0,0&1=1;

11 | 3 = 11

   00001011
|  00000011
=  00001011 = 11

>> :向右位移,就是把尾数去掉位数,例如:153 >> 2,153的二进制是:10011001,屁股后面去掉 2 位 100110,100110 转化成十进制就是 38,153 = 10011001,38 =100110,"01" 去掉了。

<< :向左位移,就是把开头两位数去掉,尾数加位数00,例如:

107 = 0110 1011 <<2
<<
172 = 1010 1100

在计算机中由于是32位的

107 = 0000 0000   0000 0000   0000 0000   0110 1011 <<2
<<
428 = 0000 0000   0000 0000   0000 0001   1010 1100

^ :两个相同的数会变成0,反之是1,例如:1&1=0,1&0=1,0&0=0,0&1=1;

11^3 = 8

   00001011
^  00000011
=  00001000 = 8

任何数异或 ^0 得到的值不变:

a^0 = a

首先异或操作是对每一位都进行异或(相同为0,不同为1),但需要先把数转换成补码才行。

1、正数的补码即本身

2、负数的补码为各位取反然后加1(最高为保持为1不变)

以-2的一个字节为例
 
原码: 1000 0010
反码: 1111 1101
补码: 1111 1110
3、将两数的补码按位进行异或

以 3 ^ (-2)为例
 
3 的补码:0000 0011
-2的补码:1111 1110
 
异或:    1111 1101  此为结果的补码,然后要反过来计算原码
 
由 原码 -> 取反 -> +1 补码  得 补码 -1 -> 取反 -> 原码
 
补码:    1111 1101
-1 :     1111 1100
原码:    1000 0011
即结果为 -3
注意:异或操作中最高位的1代表的是负号,0代表正号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值