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<
右移 >>   9>>n   把整数的各二进位除了符号位全部右移n位,高位用符号位补齐,低位丢弃等于原数除以2的n

应用:
/*
写一个函数,用来输出整数在内存中的二进制形式
*/

#include
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

int maxOFarray(int array[],int length)
{   
  //1.定义一个变量存储最大值(默认是首元素)
   int max = array[0];
   //2.遍历所有元素,找出最大值
    for(int = 1;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}
       };
应用:可以用来表示俄罗斯方块和五子棋等








你可能感兴趣的:(C语言—位运算、char、数组)