C语言实验7_宏与位运算

C语言实验7_宏与位运算

实验07(01)带参数宏的定义

题目描述
定义一个带参数的宏,实现两个数从大到小的排序。利用该宏定义编程实现输入两个数,输
出排序后的情况。
输入描述
输入双精度数。
输出描述
按 printf("%.2f,%.2f\n",a,b)从大到小的顺序输出排序结果,逗号为英文
输入样例
3,5
输出样例
5.00,3.00
#include <stdio.h>
#define scan(a, b) scanf("%lf,%lf", &a, &b)
#define print(a, b) a > b ? printf("%.2lf,%.2lf\n", a, b) : printf("%.2lf,%.2lf\n", b, a)
int main()
{
    
    
    double a, b;
    scan(a, b);
    print(a, b);
    return 0;
}

实验07(02)用带参宏求三个数的最大值

c-lab7-2 用带参宏求三个数的最大值
题目描述
定义一个带参数的宏 SEQ(x,y,z),实现只用一个宏求三个数中的最大值。
输入描述
依次输入三个双精度数
输出描述
输出其中的最大值 printf("MAX=%.2f",MAX(a,b,t))。
输入样例
1,2,3.6789
输出样例
MAX=3.68
#include <stdio.h>
#define MAX(x, y, z) x > y &&x > z ? x : (y > z && y > x ? y : (z > x && z > y ? z : 1))
int main()
{
    
    
    double x, y, z;
    scanf("%lf,%lf,%lf", &x, &y, &z);
    printf("MAX=%.2lf\n", MAX(x, y, z));
    return 0;
}

实验07(03)位运算取一个数中的某一位

题目描述
编写函数,实现将一个数(unsigned short)n 中的第 m 位取出来,并输出该位的值(从右
到左第 m 位)。
输入描述
输入:依次输入无符号数 n 和位数 m,逗号为英文。
输出描述
输出:第 m 位的值。
输入样例
5,1
输出样例
0
#include <stdio.h>
void ff(unsigned short n, int m);
int main()
{
    
    
    unsigned short n, m;
    scanf("%hu,%hu", &n, &m);
    ff(n, m);
    return 0;
}
void ff(unsigned short n, unsigned short m)
{
    
    
    unsigned short z;
    z = ((n & (1 << m)) >> m);
    printf("%hu\n", z);
}

实验07(04)高四位与低四位交换

c-lab7-4 位运算:将一个数的高四位与低四位交换题目描述
编写函数,实现将一个数(8 位二进制)中的高四位和低四位交换。
输入描述
输入一个整数
输出描述
以十进制输出变换后的整数
输入样例
165
输出样例
90
#include <stdio.h>
void ff(unsigned short a);
int main()
{
    
    
    unsigned short a;
    scanf("%hd", &a);
    ff(a);
    return 0;
}
void ff(unsigned short a)
{
    
    
    unsigned short x, y;
    x = (a & 0x0f) << 4; //165 1010 0101
    y = (a & (0xf0)) >> 4;
    printf("%hd\n", x + y);
}

实验07(05)对要求的位进行处理

题目描述
编写函数,实现将一个数中最低字节第 0、2、4、6 位按位取反,而其他位不变(从左到右)。
输入描述
输入一个整数。
输出描述
只输出最低字节数值。
输入样例
43690
输出样例
0
#include <stdio.h>
void ff(unsigned int a);
int main()
{
    
    
    unsigned int a;
    scanf("%d", &a);
    ff(a);
    return 0;
}
void ff(unsigned int a)
{
    
    
    unsigned int x, y, z, t;
    x = a & 0xff;
    y = x & 0xaa;
    t = x & 0x55;
    z = (~y) & 0xff - 0x55 + t;
    printf("%d\n", z);
}

实验07(06)循环移位

题目描述
编写函数实现将一个短整型数据(0x5545)循环左移 n 位。所谓循环左移 1 位,即将最高位
存放到最低位,而其他位左移一位。如将 101100111010 左移一位后为:011001110101;如
果将原数左移两位则为:110011101010。
输入描述
输入移位的位数
输出描述
以十六进制输出移位后短整型数。
输入样例
1
输出样例
aa8a
#include <stdio.h>
void ff(int n);
int main()
{
    
    
    int n;
    scanf("%d", &n);
    ff(n);
    return 0;
}
void ff(int n)
{
    
    
    unsigned short a, x, y;
    a = 0x5545;
    x = a << n;
    y = a >> (16 - n);
    printf("%0x\n", x + y);
}

实验07(07)利用位运算实现奇校验

题目描述
编写函数,利用位运算符实现对一个数中除最高位以外的其他二进制数进行奇校验(奇校验
就是在最高位的位置上加入一个值为1或为0的位,使该字节各个位中1的数量相加为奇数),
并将校验位存放到最高位。
例如:×0111001 →10111001
×0010101 →00010101
输入描述
输入需要校验的整数(小于 256)
输出描述
以十六进制输出被校验后的数据。
输入样例
10
输出样例
8a
#include <stdio.h>
#include <math.h>
void main()
{
    
    
    unsigned int x, y;
    unsigned int after(unsigned int a);
    scanf("%d", &x);
    y = after(x);
    printf("%0x\n", y);
}
unsigned int after(unsigned int a)
{
    
    
    int i, b = 0;
    for (i = 0; i < 7; i++)
        b += (a & (1 << i));
    if (b % 2 == 0)
        a = (a & ~0) + (unsigned int)(1 << 7);
    else
        a = (a & ~(unsigned int)(1 << 7));
    return (a);
}

猜你喜欢

转载自blog.csdn.net/weixin_44179485/article/details/112715605