对异或运算符的认识

1. 异或的本质

异或可以看作是数二进制位上的每一位无进位相加,如: 6^5
在这里插入图片描述
如图所示,从低位到高位,依次相加,0+1 = 1, 1+0=1, 1+1=2 ,有进位,把进位抛弃,剩下到就是0

2. 异或到性质

2.1 多个数进行异或,数的顺序不影响最后的结果
 int a = 5;
 int b = 6;
 int c = 4;
 System.out.println((a ^ b ^ c) == (b ^ a ^ c)); // true

因为多个数进行异或,只关心所有数的二进制位上那一位1的个数,如果1为奇数个,则每一个数的这一位相加最后结果就是1,如果是偶数个1,则每一个数的这一位相加最后结果就是0.与数的顺序无关。

2.2 重要关系式

n ^ 0 = n
n ^ n = 0

3 异或的应用

3.1 交换两个数
int a = 10;
int b = 20;

a = a^b;  
// 把a替换成 a^b,则: 
// a^b^b = a^0 = a
b = a^b; 
// 把 a替换成 a^b, 把b 替换成a
// a^b^a = a^a^b = 0^b = b 
a = a^b; 
3.2 一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
 public static int findOddCountNumber(int[] nums){


	int eor = 0;
	for (int num : nums) {
	
	     eor ^= num;
	 }
    return eor;
}
3.3 查找一个数二进制形式下1的个数

获取一个数最右侧的1

m = n & ((~n) + 1)

int n = 100;
// 0000 1010
// 1111 0101 + 1 
// 1111 0110 & 0000 1010 = 0000 0010
int result = n & ((~n) + 1);

最后的代码如下:

int count = 0;
while (n > 0) {

    int rightOne = n & ((~n) + 1);
    // 删除最右边的1,并把 删除1后的值重新赋值给 n
    n ^= rightOne;
    count++;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值