标签:lazy 输出 二进制 out operator 异或 结果 fence 位运算
位运算主要针对的是二进制,包括 异或(^), 与(&),或(|),非(~)
规则:两个位相同为0,不同为1
例1: 6 ^ 7
任意一个变量和0异或结果都是其本身 (0^N=N)
任意一个变量和其自身异或结果都是0(N^N=0)
异或运算满足交换律和结合律
例2: 巧妙利用异或,不用额外变量交换两个变量的值
public static void main(String[] args) {
?
int a = 10;
int b = 6;
// a = a^b
a = a ^ b;
// b = a^b^b = a
b = a ^ b;
// a = a ^ a^b = b
a = b ^ a;
System.out.println("a="+a + ",b=" + b);
}
输出:
a=6,b=10
例3: 选择排序中交换两个数据的位置(剩下数据中最小的与当前位置互换)
public static void main(String[] args) {
int[] nums = {5, 3, 8, 4, 2, 1, 9, 7, 6,500,100,300,200,400};
for (int i=0;i<nums.length;i++){
int n = i;
for (int j=i;j<nums.length;j++){
if (nums[n]>nums[j]){
n = j;
}
}
if (i!=n){
nums[i] = nums[i] ^ nums[n];
nums[n] = nums[i] ^ nums[n];
nums[i] = nums[i] ^ nums[n];
}
}
System.out.println(Arrays.toString(nums));
?
}
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 100, 200, 300, 400, 500]
例4: 一个数组中只有一种数出现奇数次,其他都出现偶数次,怎么找到这个数
public static void main(String[] args) {
int[] nums = {3,5,5,8,8,3,10};
int eor=0;
for(int i=0;i<nums.length;i++){
eor = eor^nums[i];
}
System.out.println("奇数="+eor);
}
输出:
奇数=10
因为相同数字异或是0,所以其中的所有偶数的数据结果都是0,最后结果就剩下 0^10 = 10
标签:lazy 输出 二进制 out operator 异或 结果 fence 位运算
原文地址:https://www.cnblogs.com/sunjiguang/p/14827984.html