1. 程式人生 > >C語言—位運算、char、陣列

C語言—位運算、char、陣列

---位運算


1.按位與 &  

 9 & 5    
1001
0101
----
0001
a&1 == 1  奇數
a&1 == 0  偶數

2.按位或 |   

9 | 5
1001
0101
----
1101

3.按位異或 ^  對應二進位制位一樣就為0,不一樣就為1

1001
0101
----
1100
1>相同數值進行異或,結果肯定是0,比如9^9
2>交換 9^5^6 == 9^6^5
3>任何數值跟0進行異或,結果還是原來的數值,9^0 == 9  
4>a^b^a == b
用第四條交換兩個變數的值
a = a ^ b;
b = a ^ b;
a = a ^ b;

按位取反  ~   對應單個數  0變1,1變0
~0000 0000 0000 0000 0000 0000 0000 1001
 1111 1111 1111 1111 1111 1111 1111 0110

4.左移和右移

左移 <<   9<<n   把整數的各二進位全部左移n位,高位丟棄,低位補0,等於原數乘以2的n次方,最高位捨棄,正負性改變

右移 >>   9>>n   把整數的各二進位除了符號位全部右移n位,高位用符號位補齊,低位丟棄等於原數除以2的n

應用:
/*
寫一個函式,用來輸出整數在記憶體中的二進位制形式
*/

#include <stdio.h>
void printBinary(int number);

int main()
{
    /*
     0000 0000 0000 0000 0000 0000 0000 0000
     0000 0000 0000 0000 0000 0000 0000 1111
     
     9 : 0000 0000 0000 0000 0000 0000 0000 1001
     -10 : 1111 1111 1111 1111 1111 1111 1111 0110
     */
    
    //printf("%d\n", ~9);    
    
    printBinary(-10);
    return 0;
}

void printBinary(int number)
{    
    // 記錄現在挪到第幾位
    // (sizeof(number)*8) - 1 == 31
    int temp = ( sizeof(number)<<3 ) - 1;
    
    while ( temp >= 0 )
    {
        // 先挪位,再&1,取出對應位的值
        int value = (number>>temp) & 1;
        printf("%d", value);
        temp--;        
        // 每輸出4位,就輸出一個空格
        if ( (temp + 1) % 4 == 0 )
        {
            printf(" ");
        }
    }   
    printf("\n");

}

---資料型別char

1.字元,輸出為%c,建立 char a = 'b'(需要用' '括住)
  單引號''只能擴住單位元組的字元,如果是每有' '的整數,則有轉化成相應的ASCII值對應的字元(有免費的ASCII表)
    // char c = '男'; // 錯誤寫法
    
    //char c = "A";// 錯誤寫法
        
    // char c = A; // 錯誤寫法
    
    // char c = 65;

2.典型例題

寫一個函式,將小寫字母轉為大寫

char upper(char c)
{
    // 如果是小寫字母,就轉成大寫
    /*
    if (c>='a' && c<='z') { // ['a', 'z']
        return c - ('a'-'A');
    } else {// 如果不是小寫字母,返回字母本身
        return c;
    }*/
    
    // 如果是小寫字母,就轉成大寫
    if (c>='a' && c<='z') { // ['a', 'z']
        return c - ('a'-'A');
    }
    // 如果不是小寫字母,返回字母本身
    return c;
}

int main()
{
    char cc = upper('f');
    
    printf("%c\n", cc);
    return 0;
}

---構造型別 陣列

1.結構
只能存放一種型別的資料
陣列的定義格式:型別 陣列名[元素個數];int ages[5];

2.陣列的正確寫法和錯誤寫法

以下四種都是正確寫法:
nt ages[5] = {10 , 11, 12, 67, 56};
int ages[5] = {10, 11};
int ages[5] = {[3] = 10, [4] = 11};
int ages[] = {10, 11, 14};

正確寫法
int ages['A'-50] = {10, 11, 12, 14, 16};
int size = sizeof(ages);
printf("%d\n", size);
    
正確寫法    
int count = 5;
int ages[count];
ages[0] = 10;
ages[1] = 11;
ages[2] = 18;
 
錯誤寫法
int ages[5];
ages = {2,123,213,323,5645}

錯誤寫法
int count = 5;
int ages[count] = {10,11,12}

如果想在定義陣列的同時進行初始化,陣列元素個數必須是常量,或者不寫
int ages[count] = {10, 11, 12}; // 錯誤寫法

3.計算整型陣列的長度
算出陣列的長度:int count = sizeof(ages)/sizeof(int);

注意:::陣列的名字代表陣列的地址以及第一個元素的地址

陣列作為函式引數,可以省略元素個數
陣列作為函式引數,傳遞是整個陣列的地址,修改函式形引數組元素的值,會影響到外面的實引數組

4.陣列的遍歷:按順序檢視陣列的每一個元素
    
    for (int i = 0; i<5; i++)
    {
        printf("ages[%d]=%d\n", i, ages[i]);
    }


5.陣列練習

1>
/*
 提示使用者輸入5個學生的成績,算出平均分並且輸出
 */


int main()
{   
    // 1.定義一個數組來儲存成績
    int scores[5];
    
    // 2.提示輸入成績
    // 用來儲存總分
    int sum = 0;
    for (int i = 0; i<5; i++) {
        // 2.1 提示輸入某個學生的成績
        printf("請輸入第%d個學生的成績:\n", i + 1);
        // 2.2 儲存當前學生的成績
        scanf("%d", &scores[i]);
        // 2.3 累加成績
        sum += scores[i];
    }
    
    // 3.計算平均分,並且輸出
    printf("平均分是%f\n", sum/5.0);
    return 0;
}

2>
設計一個函式,找出整形陣列元素的最大值(陣列當作函式引數傳遞時,會當作指標變數來使用,指標變數在64bit編譯器環境下,佔據8個位元組,不管傳遞的陣列有多大)

#include<stdio.h>

int maxOFarray(int array[],int length)
{   
  //1.定義一個變數儲存最大值(預設是首元素)
   int max = array[0];
   //2.遍歷所有元素,找出最大值
    for(int = 1;i<length;i++)
  {  
      if(max < array[i])
           {max = array[i];}
  }
return max;


int main()

int ages[] = {11,90,67,100,96,89,100};
int max = maxOFarray(age,sizeof(ages)/sizeof(int));
printf("%d",max);
return 0;
}

6.二維陣列
int ages2[3][5]= {
        {10, 11, 90, 89, 70},
        
        {10, 11, 90, 89, 70},
        
        {10, 11, 90, 89, 70}
       };
應用:可以用來表示俄羅斯方塊和五子棋等