叶圣民//嵌入式学习//2018.07.16.

学习日志        姓名:叶圣民   日期:2018.07.13.

 

 

 

 

今日学习任务

 

1、完成指针、数组、函数等内容的测试;

2、熟练掌握运算符的使用;i++与++i、位操作使用技巧

3、熟练掌握宏的使用技巧;(宏的技巧及红函数的定义

日任务完成情况

 

(详细说明本日任务是否按计划完成,开发的代码量)

  1. 了解变量的三大特点
  2. CPU,内存和硬盘之间的相关知识
  3. C语言结束标志
  4. 位运算,左移和右移

 

日开发中出现的问题汇总

 

  1. 不能熟练使用 i++ 和 ++i

 

 

日未解决问题

 

日开发收获

1.     了解变量的三大特点

2.     有关CPU,内存和硬盘的知识

3.     C语言结束标志  , 函数()  ;

4.   位运算知识,按位与,按位或,异或

 

自我评

 

(是否按开发规范完成既定任务,需要改进的地方,与他人合作效果等)

 

 

对i++ , ++i的使用不熟练,以及了解位运算相关知识

Training2:位操作训练

  1. 题目:请编写一个c函数,该函数给出一个整数中被置为1的位的个数
  2. 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
  3. 题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
  4. 题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
  5. 题目:输入一个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;
}



猜你喜欢

转载自blog.csdn.net/qq_31421117/article/details/81072384