c语言练习题 一:

时间:2022-06-01 16:51:25

1.使用宏实现两个数中求较大值


#define MAX(a,b) (a)>(b)?(a):(b)

int main()
{
    int max = MAX(3,4);
    printf("max = %d\n",max);
    return 0;
}

2.写一个宏可以将一个数字的奇数位和偶数位交换

#define SWAP(num) (num = ((num & 0xaaaaaaaa) >> 1) | ((num & 0x55555555) << 1))
int main()
{
    int num = 30;
    SWAP(num);
    printf("%d\n",num);
    return 0;
}

3.////编写函数:
////unsigned int reverse_bit(unsigned int value);
////这个函数的返回 值value的二进制位模式从左到右翻转后的值。
////
////如:
////在32位机器上25这个值包含下列各位:
////00000000000000000000000000011001
////翻转后:(2550136832)
////10011000000000000000000000000000
////程序结果返回:
////2550136832

typedef unsigned int unit;
#include<math.h>
unsigned int reverse_bit(unsigned int value)
{
    int i = 0;
    unsigned int num = 0;
    for(i=0;i<32;i++)
    {
        //num = (unit)(num + ((value >> i) & 1) * pow(2,32-i-1));
        num |= ((value >> i) & 1) << (31 - i);       //效率更高 (拿到那一位将它左移到对应位,进行 或等 就会得到翻转的值)

    }
    return num;
}

int main()
{
    unsigned int i = 0;
    unsigned int ret = 0;
    scanf("%d",&i);         //不能写成 scanf("%u",%i); 程序会崩溃
    ret = reverse_bit(i);
    printf("%u\n",ret);
    //printf("%d\n",sizeof(unit));
    return 0;
}

4.不使用(a+b)/2这种方式,求两个数的平均值

//方法一

int Average(int x, int y)
{
    return y+(x-y)/2;
}

//方法二
00001010     10
00010100     20

00000000     & 
00011110     ^
00001111     ^ >>1

//首先,&得到的数字位,只有两个1才得到1,就是进位的1,
//而本该向前进一位的1待在了本位。实际上
//应该让得到的结果左移1(让进位的1进到合适的位置),
//然后再右移1(除以2),得到进位的平均数。
//然后,^得到的数字位,实际得到的是本位得到的结果(不包括进位),
//让他右移1,得到本位的平均数。
//两个平均数相加,得到整个数完整的平均数。

#include<math.h>
int Average(int x, int y)
{
    return (x & y) + ((x ^ y) >> 1);    //(x&y) x和y相同位的平均值 (x^y)>>1 x和y不同位的平均值
}

int main()
{
    int a = 25;
    int b = 15;
    int ret = 0;
    ret = Average(a,b);
    printf("%d\n",ret);
    return 0;
}

5.////编程实现:
////一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
////请找出这个数字。(使用位运算)

int look_out(int *a, int len)
{
int i = 0;
int ret = 0;
for(i=0;i

//求字符串长度
int my_strlen(const char *dst)
{
    int count = 0;
    while(*dst != '\0')
    {
        dst++;
        count++;
    }
    return count;
}


////逆序函数
void Reverse(char arr[], int left, int right)
{   
    while(left<right)
    {
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
}


////逆序字符串
char* reverse_str(char arr[])
{
    int left = 0;
    int right = my_strlen(arr) - 1;
    int i = 0;
    //先逆序整个字符串
    Reverse(arr,left,right);
    //逐个逆序单词
    while(arr[i] != '\0')
    {
        left = i;
        //逆序一个单词
        while((arr[i] != ' ') && arr[i] != '\0')    //条件重点理解
        {
            i++;
        }
        right = i - 1;             //i是空格的下标
        Reverse(arr,left,right);
        if(arr[i] == ' ')         //判断不能少,不然会跳过\0,程序崩溃, 也不能写成 !=
        {
            i++;
        }
    }
    return arr;
}


int main()
{
    char arr[] = "chao li";
    reverse_str(arr);
    printf("%s\n",arr);

    return 0;
}