计组实验一
题目要求
x为 int类型变量,最左边的位为最高位,即第31位;最右边的位为最低位,即第0位。分别编写7个C语言函数,完成以下操作:
1、 将x的第0~12位取反,其他位不变;
2、 将x的第13~17位清零,其他位不变;
3、 将x的第18~22位置1,其他位不变;
4、 将x的23~28位替换为用户任意指定的6个比特,例如将这6位设置为0x2a,其他位不变;
5、若0≤i≤31,0≤j≤31,且j≥i,读取x的第i~j位的内容。
6、若0≤i≤31,交换x的第i位和第31-i位。
7、根据x最高3位的值(数值范围应为0~8),完成下列操作,并输出操作结果:
(1)值为1,完成第1题的操作;
(2)值为2,完成第2题的操作;
(3)值为3,完成第3题的操作;
(4)值为4,完成第4题的操作; (5)值为5,完成第5题的操作; (6)值为6,完成第6题的操作;
(7)值为其他,不做操作。
这次的题目题目并不难,重点主要在于位操作运算,还有一些c语言的指针知识运用
二进制转换
void ToBinary(int x, int *array)
{
int i, j = 0, num;
for (i = 31; i >= 0; i--, j++)
{
num = x >> i & 1;
*(array + j) = num;
}
}
这个代码最为关键,与普通的二进制转换不同的是
num = x >> i & 1;
这一步涉及到c语言的位操作符:
C语言里所有的位运算都是指二进制数的位运算。即使输入的是十进制的数,在内存中也是存储为二进制形式。
“<<”用法:
格式是:a<<m,a和m必须是整型表达式,要求m>=0。
功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。
“>>”用法:
格式是:a>>m,a和m必须是整型表达式,要求m>=0。
功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0
双目运算符,第一运算对象是移位对象,第二个运算对象是所移的二进制位数
通过查阅优先级表,我们可以知道 >> 移位操作优先于 & 操作
num = x >> i & 1;
在这里我们以17为例
17的二进制表示(8位)
0001 0001
1的二进制表示
0000 0001
这里的右移操作相当于传送带功能,将数据依次右移,最右端数据输出
(&1等价于输出本身)
指针数组
这道题中需要利用函数传递数组,因此指针的使用尤为重要
(要及时把c语言的这一块内容做复习)
以其中的一部分函数为例
void ToBinary(int x, int *array)
{
int i, j = 0, num;
for (i = 31; i >= 0; i--, j++)
{
num = x >> i & 1;
*(array + j) = num;
}
}
//将x的第0~12位取反,其他位不变
int clc1(int x)
{
int i,j;
int array1[32];
ToBinary(x, array1);
for (i = 19; i <= 31; i++)
{
*(array1 + i) ^= 1;
}
printf("The No.1 answer is :\n");
for (j = 0; j <= 31; j++)
{
printf("%d ", *(array1 + j));
}
printf("\n");
return 0;
}
在第二个函数中,我调用了ToBinary()函数
ToBinary(x, array1);
array1[ ]是我新建的数组,在传送参数时,直接写上数组名就可以了
在被调用函数的声明中,第二个参数是指针指向的数组(感觉说的不太准确)
void ToBinary(int x, int *array)
代码
最后附上全部代码
#include <stdio.h>
#include <stdlib.h>
/*
x为 int类型变量,最左边的位为最高位,即第31位;最右边的位为最低位,即第0位。分别编写7个C语言函数,完成以下操作:
*/
void ToBinary(int x, int *array)
{
int i, j = 0, num;
for (i = 31; i >= 0; i--, j++)
{
num = x >> i & 1;
*(array + j) = num;
}
}
//将x的第0~12位取反,其他位不变
int clc1(int x)
{
int i,j;
int array1[32];
ToBinary(x, array1);
for (i = 19; i <= 31; i++)
{
*(array1 + i) ^= 1;
}
printf("The No.1 answer is :\n");
for (j = 0; j <= 31; j++)
{
printf("%d ", *(array1 + j));
}
printf("\n");
return 0;
}
//将x的第13~17位清零,其他位不变
int clc2(int x)
{
int i,j;
int array2[32];
ToBinary(x, array2);
for (i = 14; i <= 18; i++)
{
*(array2 + i) = 0;
}
printf("The No.2 answer is :\n");
for (j = 0; j <= 31; j++)
{
printf("%d ", *(array2 + j));
}
printf("\n");
return 0;
}
//将x的第18~22位置1,其他位不变
int clc3(int x)
{
int i,j;
int array3[32];
ToBinary(x, array3);
for (i = 9; i <= 13; i++)
{
*(array3 + i) = 0;
}
printf("The No.3 answer is :\n");
for (j = 0; j <= 31; j++)
{
printf("%d ", *(array3 + j));
}
printf("\n");
return 0;
}
//将x的23~28位替换为用户任意指定的6个比特,例如将这6位设置为0x2a,其他位不变
int clc4(int x)
{
int i,j;
int array4[32];
ToBinary(x, array4);
printf("Please input six bits:\n");
for (i = 2; i <= 7; i++)
scanf("%d",&array4[i]);
printf("The No.4 answer is :\n");
for (j = 0; j <= 31; j++)
{
printf("%d ", *(array4 + j));
}
printf("\n");
return 0;
}
//若0≤i≤31,0≤j≤31,且j≥i,读取x的第i~j位的内容
int clc5(int x)
{
int i,j,k;
int array5[32];
printf("Please input i&j:\n");
scanf("%d%d",&i,&j);
ToBinary(x, array5);
printf("The No.5 answer is :\n");
for (k = 31 - j; k <= 31 - i; k++)
{
printf("%d ", *(array5 + k));
}
printf("\n");
return 0;
}
//若0≤i≤31,交换x的第i位和第31-i位
int clc6(int x)
{
int i,j,temp,k;
int array6[32];
printf("Please input the i&j you need to switch:\n");
scanf("%d%d",&i,&j);
ToBinary(x, array6);
temp = *(array6+i);
*(array6+i)=*(array6+j);
*(array6+j)=temp;
printf("The No.6 result is:\n");
for(k=0;k<=31;k++)
{
printf("%d ",*(array6+k));
}
printf("\n");
return 0;
}
int Judge()
{
char key;
printf("Continue Or Not?(Y/N):\n");
fflush(stdin);
scanf("%c",&key);
if ((key == 'Y')||(key == 'y'))
return 1;
else
return 0;
}
int main()
{
int i, num,flag=1;
while(flag)
{
printf("Which test?\n");
scanf("%d",&i);
switch (i)
{
case 1:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc1(num);
flag=Judge();
}
break;
case 2:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc2(num);
flag=Judge();
}
break;
case 3:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc3(num);
flag=Judge();
}
break;
case 4:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc4(num);
flag=Judge();
}
break;
case 5:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc5(num);
flag=Judge();
}
break;
case 6:
{
printf("Please input the number:\n");
scanf("%d", &num);
clc6(num);
flag=Judge();
}
break;
case 7:
{
printf("The six answers are:\n");
clc1(1);
clc2(2);
clc3(3);
clc4(4);
clc5(5);
clc6(6);
flag=Judge();
}
break;
default:
break;
}
}
return 0;
}
总结
对于c语言要再多复习多看,为了后续刷算法题,数据结构要再复习一遍