一:運算子
&:按位與----2進位制
|:按位或----2進位制
^:按位異或----2進位制
~:按位取反---2進位制
&:先上程式碼,然後解釋
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 int main() 5 { 6 int a = 3; 7 int b = -5; 8 int c = a & b; 9 printf("%d\n", c); 10 return 0; 11 }
這裡的結果是:3
為什麼呢,a=5,是正數,所以原碼,反碼,補碼都是一樣的,---->00000000000000000000000000000011
b=-5,是負數,先寫原碼,首位是1,因為負數是1, ---->10000000000000000000000000000101
再寫反碼, ---->11111111111111111111111111111010
最後再寫補碼 ---->11111111111111111111111111111011
因為機器上面,運算都是用補碼來進行的,所以用a=5與b=-5的補碼進行&運算,(&運算:全1得1,有0則0),所以:
00000000000000000000000000000011,最後再換算成為:原碼,因為開頭的地方是0,所以這個是正數,原碼,反碼,補碼都是一樣的,
%d這個列印的是一個有符號的整數,所以最終的結果是:3
|:先上程式碼,然後解釋
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int main() 6 { 7 int a = 3; 8 int b = -5; 9 int c = a | b; 10 printf("%d\n", c); 11 return 0; 12 }
這裡的結果是:-5
先寫上a的補碼:00000000000000000000000000000011
再寫上b的補碼:11111111111111111111111111111011
|:(|運算:全0得0,有1則1),所以:11111111111111111111111111111011
因為答案求原碼,所以:先有補碼轉換成反碼:11111111111111111111111111111010
最後再轉化成原碼:10000000000000000000000000000101
%d這個列印的是一個有符號的整數,所以最終的結果是:-5
^:先上程式碼,然後解釋
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 5 int main() 6 { 7 int a = 3; 8 int b = -5; 9 int c = a ^ b; 10 printf("%d\n", c); 11 return 0; 12 }
這裡的結果是:-8
先寫上a的補碼:00000000000000000000000000000011
再寫上b的補碼:11111111111111111111111111111011
^:(^運算:相同為0,相異位1),所以:11111111111111111111111111111000
因為答案求原碼,所以:先有補碼轉換成反碼:11111111111111111111111111110111
最後再轉化成原碼:10000000000000000000000000001000
%d這個列印的是一個有符號的整數,所以最終的結果是:-8
再將異或的操作,5^5=0;00-------101^00-------101=00-------000,--->這裡就可以得出結論:a^a=0
5^0=0;00-------101^00-------000=00-------101,--->這裡就可以得出結論:a^0=a
2^5^2=5;
2:00000000000000000000000000000010
5:00000000000000000000000000000101
2^5=00000000000000000000000000000111
2^5^2=00000000000000000000000000000101
故由上述運算流程可以得知,異或操作支援交換律
所以完全可以得知,2^5^2=2^2^5=5
二:小程式題
不能建立臨時變數(第三個變數),實現兩個數的交換
先寫一個可以建立臨時變數的,直接上程式碼
1 #include<stdio.h> 2 3 void swap(int* n1,int* n2) 4 { 5 int num=*n1; 6 *n1=*n2; 7 *n2=num; 8 } 9 int main() 10 { 11 int n1=0; 12 int n2=0; 13 scanf("%d %d",&n1,&n2); 14 swap(&n1,&n2); 15 printf("%d %d\n",n1,n2); 16 return 0; 17 }
這裡就是直接利用臨時變數來進行兩個數的交換的
而題目要求是不能建立臨時變數,所以先上第一個有點問題的程式碼
1 #include<stdio.h> 2 void swap(int* n1,int* n2) 3 { 4 *n1=*n1+*n2; 5 *n2=*n1-*n2; 6 *n1=*n1-*n2; 7 } 8 int main() 9 { 10 int n1=0,n2=0; 11 scanf("%d %d",&n1,&n2); 12 swap(&n1,&n2); 13 printf("%d %d\n",n1,n2); 14 }
這裡的小問題就是:n1,n2這兩個變數是Int型別的,是存在最大值的,所以會出現溢位的情況,所以在這裡會出現小問題,故有第二個改進方法
直接上程式碼
1 #include<stdio.h> 2 void swap(int* n1,int* n2) 3 { 4 *n1=*n1^*n2; 5 *n2=*n1^*n2; 6 *n1=*n1^*n2; 7 } 8 int main() 9 { 10 int n1=0,n2=0; 11 scanf("%d %d",&n1,&n2); 12 swap(&n1,&n2); 13 printf("%d %d\n",n1,n2); 14 }
這裡就不存在溢位的問題,這裡直接利用運算子異或(^),相同則0,相異為1,來直接進行操作
但這裡還有一個限定條件:只是適用於整形,不能用在浮點型