位運(yùn)算主要針對(duì)的是二進(jìn)制,包括 異或(^)换淆, 與(&)摄职,或(|),非(~)
1. 下面說下異或的規(guī)則和應(yīng)用場(chǎng)景
規(guī)則:兩個(gè)位相同為0笼踩,不同為1
例1: 6 ^ 7
值 | 二進(jìn)制 |
---|---|
6 | 1 1 0 |
7 | 1 1 1 |
1=6^7 | 0 0 1 |
2. 異或運(yùn)算的性質(zhì)
任意一個(gè)變量和0異或結(jié)果都是其本身 (0^N=N)
任意一個(gè)變量和其自身異或結(jié)果都是0(N^N=0)
異或運(yùn)算滿足交換律和結(jié)合律
3. 巧妙使用的例子
例2: 巧妙利用異或檬寂,不用額外變量交換兩個(gè)變量的值
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: 選擇排序中交換兩個(gè)數(shù)據(jù)的位置(剩下數(shù)據(jù)中最小的與當(dāng)前位置互換)
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: 一個(gè)數(shù)組中只有一種數(shù)出現(xiàn)奇數(shù)次,其他都出現(xiàn)偶數(shù)次戳表,怎么找到這個(gè)數(shù)
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("奇數(shù)="+eor);
}
輸出:
奇數(shù)=10
因?yàn)橄嗤瑪?shù)字異或是0桶至,所以其中的所有偶數(shù)的數(shù)據(jù)結(jié)果都是0,最后結(jié)果就剩下 0^10 = 10
歡迎關(guān)注公眾號(hào):Java質(zhì)變之路