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}
};
應用:可以用來表示俄羅斯方塊和五子棋等