重溫c語言之,7天開整,就是隨便的寫寫,第十天

我是一个小笨蛋發表於2024-11-11

一:運算子

  &:按位與----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,來直接進行操作

  但這裡還有一個限定條件:只是適用於整形,不能用在浮點型

相關文章