学习日志 姓名:叶圣民 日期:2018.07.13.
|
|
今日学习任务
| 1、完成指针、数组、函数等内容的测试; 2、熟练掌握运算符的使用;(i++与++i、位操作使用技巧) 3、熟练掌握宏的使用技巧;(宏的技巧及红函数的定义 |
今日任务完成情况
(详细说明本日任务是否按计划完成,开发的代码量) |
|
今日开发中出现的问题汇总
|
|
今日未解决问题
| 无 |
今日开发收获 | 1. 了解变量的三大特点 2. 有关CPU,内存和硬盘的知识 3. C语言结束标志 , 函数() ; 4. 位运算知识,按位与,按位或,异或 |
自我评价
(是否按开发规范完成既定任务,需要改进的地方,与他人合作效果等)
| 对i++ , ++i的使用不熟练,以及了解位运算相关知识 |
Training2:位操作训练
- 题目:请编写一个c函数,该函数给出一个整数中被置为1的位的个数
- 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
- 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- 题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
- 题目:输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b,使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
提示:0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1;
第一题
#include <stdio.h>
typedef unsigned int uint;
void int2bit(uint num) //定义函数 int2bit
{
uint i;
uint count;
uint temp;
while(num != 0) //判断输入是否为 0 ;为 0 退出,不为 0 循环;实现可选择退出的
{
count = 0; //temp初始化为 0
temp = num;
for(i = 0;i < 32;i++) //循环按位判断该位是否为1,为 1 count 加 1,实现记录出现 1 的次数
{
if((num & 1) == 1) //判断当前num最低位是否为 1,为 1 count 加 1,实现记录出现 1 的次数
{
count++; //条件为真count 加 1;
}
num = num >> 1; //num 向右移 1 位
}
printf(" %d 的2进制码中有 %d 个 1\n",temp,count); //格式化输出: temp 的2进制码中有 count 个 1
printf("请输入数据:\n"); //格式化输出:请输入数据:
printf(" "); //格式化输出:空格
scanf("%d",&num); //格式化输入 num
}
printf("已退出!\n"); //格式化输出:已退出!
}
int main()
{
uint num;
printf("退出(0),统计输入数据二进制码中 1 的个数\n");
printf("请输入数据:\n");
printf(" ");
scanf("%d",&num);
int2bit(num); //调用int2bit()函数
return 0;
}
第二题
#include <stdio.h>
typedef unsigned int uint; //宏定义 uint 代表 unsigned int
void fetch_bit(uint a,uint p1,uint p2) //定义输出数据二进制码的函数
{
uint i;
uint mask = ~0; //mask = 0xffffffff;32位
uint temp = 0x80000000;
mask = (mask >> (32 - (p2 - p1 + 1))) << p1; //mask先右移再左移
a = a & mask; //a 和 mask 按位与
for(i = 0;i < 32;i++) //循环实现输出数据的二进制码
{
if((i >= 31 - p2) && (i <= 31 - p1)) //输出在所给定范围内的二进制码
{
if((a & temp) == (temp)) //判断 a 最高位是否为 1 ,为 1 就输出 1 ;不为 1 就输出 0
{
printf("1");
}
else
{
printf("0");
}
}
a = a << 1; // a 每次左移一位
}
printf("\n"); //换行
}
int main() //主函数
{
uint a = 1;
uint p1;
uint p2;
printf("输出所给数据的二进制断选码\n");
while(a != 0) //a 不为 0 ,循环; a 为 0 退出;实现可选择的退出功能
{
printf("quit:0 请输入数据: ");
scanf("%d",&a); //读取键盘输入给 a;
if(a == 0) //a 为 0 退出循环
break;
printf("请输入低位: ");
scanf("%d",&p1); //读取键盘数据给 p1
printf("请输入高位: ");
scanf("%d",&p2); //读取键盘输入给 p2
fetch_bit(a,p1,p2); //调用 fetch_bit()函数;
}
printf("已退出!\n");
return 0;
}
第三题
#include <stdio.h>
typedef unsigned int uint; //宏定义 uint 代表 unsigned int
void fetch_bit(uint a,uint p1,uint p2) //定义输出数据二进制码的函数
{
uint i;
uint mask = ~0; //mask = 0xffffffff;32位
uint temp = 0x80000000;
mask = (mask >> (32 - (p2 - p1 + 1))) << p1; //mask 先右移后左移
a = a ^ mask; //a 为 a 异或 mask
for(i = 0;i < 32;i++) //for循环实现二进制码输出
{
if((i >= 31 - p2) && (i <= 31 - p1)) //输出所给范围内的数据
{
if((a & temp) == (temp)) //如果 a 的最高位为 1 ;输出 1 ;不为 1 ;输出 0
{
printf("1");
}
else
{
printf("0");
}
}
a = a << 1; // a 每次 左移 1 位
}
printf("\n"); //换行
}
int main() //主函数
{
uint a = 1;
uint p1;
uint p2;
printf("按位取反输出所给数据的二进制断选码\n"); //格式化输出:输出所给数据的二进制断选码
while(a != 0) //判断 a 是否为 0 ;为 0 退出,不为 0 循环;实现可选择的退出功能
{
printf("quit:0 请输入数据: "); //格式化输出:quit:0 请输入数据:
scanf("%d",&a); //读取键盘输入给 a
if(a == 0) //如果 a 为 0 ;退出 while 循环
break;
printf("请输入低位: "); //格式化输出:请输入低位:
scanf("%d",&p1); //读取键盘输入给 p1
printf("请输入高位: "); //格式化输出:请输入高位:
scanf("%d",&p2); //读取键盘输入给 p2
fetch_bit(a,p1,p2); //调用函数 fetch_bit()函数;
}
printf("已退出!\n"); //格式化输出:已退出!
}
第四题
#include <stdio.h>
typedef unsigned int uint; //宏定义 uint 代表 unsigned int
void fetch_bit(uint a,uint p,uint v) //定义输出2进制码的函数
{
uint i;
uint temp = 0x80000000; //无符号整型temp 32 位:1000 0000 0000 0000 0000 0000 0000 0000
for(i = 0;i < 32;i++) //循环输出数据的二进制码
{
if(i == (31 - p)) //如果 i 等于 31 - p ;输出修改的数据 v
{
printf("%d",v); //打印 v;
}
else //否则执行输出原数据的二进制对应位置的数据
if((a & temp) == (temp)) //如果 a 最高位为 1 ;输出 1
{
printf("1");
}
else //a 最高位不为 1 输出 0;
{
printf("0");
}
a = a << 1; //a 每次左移一位
if(0 == (i + 1) % 4) //如果条件满足格式化输出:空格;实现没四位数据空格一次
printf(" ");
}
printf("\n"); //换行
}
int main() //主函数
{
uint a = 1; //无符号整型 a 初始化为 1;不影响工作
uint p;
uint v;
printf("退出(0) 改变所给位置的二进制数\n"); //格式化输出:退出(0) 改变所给位置的二进制数
while(a != 0) //如果 a 不为0,循环;实现可选择的退出功能
{
printf("请输入数据: "); //格式化输出:请输入数据:
scanf("%d",&a); //读取键盘输入给 a
if(a == 0) //如果 a 等于 0;退出循环
break;
printf("请输入要改的位置(左高右低): "); //格式化输出:请输入要改的位置(左高右低):
scanf("%d",&p); //读取键盘输入给 p
printf("请输入第 %d 位置要给的数据: ",p); //格式化输出:请输入第 %d 位置要给的数据:
scanf("%d",&v); //读取键盘输入给 v
printf("结果为:\n"); //格式化输出:结果为:
fetch_bit(a,p,v); //调用 fetch_bit()函数;
}
printf("已退出!\n"); //格式化输出:已退出!
return 0;
}
第五题
#include <stdio.h>
void int2bit(int num)//输出32位二进制
{
int i;//for循环变量
unsigned int mask = 0x80000000;//掩码,用于从最高位开始判断输出
for(i = 0; i < 32; i++)//循环输出num
{
if((num & mask) == mask)//如果该位为1
{
printf("1");//输出1
}
else//否则
{
printf("0");//输出0
}
if(((i + 1) % 4) == 0)//每输出4个数空一格
{
printf(" ");//输出空格
}
num = num << 1;//num向左移位
}
printf("\n"); //换行
}
int aXORb(int a) //将a各位由相邻两位异或,得到b
{
int i;
int b = 0;
for(i = 0; i < 32; i++) //循环得出每一位
{
if(i == 0) //第1位
{
b = b + (((a >> 1) & 1) ^ 0); //由第2位和0异或
}
else if(i == 31) //第32位
{
b = b + ((((a >> 30) & 1) ^ 0) << 31); //由第31位和0异或
}
else //其他情况
{
b = b + ((((a >> (i + 1)) & 1) ^ ((a >> (i -1)) & 1)) << i); //由相邻两位异或,再移动回原来的位置,累加起来即为b
}
}
return b; //返回b
}
int main()
{
int aXORb(int a); //a转为b函数声明
void int2bit(int num); //b显示32位二进制
int a; //要转变的值
int s; //转变后的值
printf("输入a,b为a二进制码相邻位异或的到\n");
printf("退出(0)\n");
printf("请输入a:\n"); //输入提示
scanf("%d", &a); //输入a
while(a != 0)
{
s = aXORb(a); //得到转变后的值
printf("结果为:\n"); //输出提示
int2bit(s); //32位二进制显示
printf("退出(0)\n");
printf("请输入a:");
scanf("%d",&a);
}
printf("已退出!\n");
return 0;
}