你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

来看用指针实现高低位倒序!

[复制链接]
gaosmile 发布时间:2020-5-13 19:29
昨晚在微信群看到一个读者发的面试题目,从网上截图出来的,我百思不得其解,题目如图。

微信图片_20200513192748.jpg

幸好,我学过

然后我写了个小程序

第一个方法比较笨,当我写完自己的代码后,看到有同学发了自己的代码,我赶紧就发了个红包,一个是为了鼓励大家多讨论问题,一个是为了赞扬这样的行为。

第一个方法就是取出每一个bit,压栈,然后再出栈,你想怎么排序都没有问题。

#include "stdio.h"
#include "stdlib.h"

struct List{
        int data;
        struct List * next;
};

struct Stack{
        struct List *head;
        int size;
};


struct Stack * StackInit(void)
{
        struct Stack *stack = NULL;
        stack =  (struct Stack*)malloc(sizeof(struct Stack));
        stack->head = (struct List *)malloc(sizeof(struct List));
        stack->head->next = NULL;
        stack->size = 0;
        return stack;
}

int StackPush(struct Stack *stack,int data)
{
        struct List *tmp = (struct List *)malloc(sizeof(struct List));
        tmp->data = data;
        tmp->next = stack->head->next;
        stack->head->next = tmp;
        stack->size++;
        //printf("push:%d \n",data);
        return 0;
}

int IsStackEmpty(struct Stack *stack)
{
        if(stack->head->next == NULL){
                //printf("stack null\n");
                return 1;
        }else{
                //printf("stack is not null\n");
                return 0;
        }
}

int StackPop(struct Stack *stack,int *data)
{
        struct List *tmp = NULL;
        if(IsStackEmpty(stack))
                return -1;
               
        tmp = stack->head->next;
        *data = tmp->data;
        stack->head->next = tmp->next;
        stack->size--;
        if(tmp!=NULL)
                free(tmp);
       
        //printf("pop:%d \n",*data);
        return 0;
}


int main(void)
{
        int i = 0;
        unsigned char a = 0x71;
        unsigned char b = 0;
       
        struct Stack *stack = NULL;
        stack = StackInit();

        printf("a:0x%x\n",a);
        for(i = 0;i<8;i++)
        {

                if(a&0x10) StackPush(stack,1);
                else       StackPush(stack,0);
                if(a&0x20) StackPush(stack,1);
                else       StackPush(stack,0);
                if(a&0x40) StackPush(stack,1);
                else       StackPush(stack,0);
                if(a&0x80) StackPush(stack,1);
                else       StackPush(stack,0);

                if(a&0x01) StackPush(stack,1);
                else       StackPush(stack,0);               
                if(a&0x02) StackPush(stack,1);
                else       StackPush(stack,0);
                if(a&0x04) StackPush(stack,1);
                else       StackPush(stack,0);       
                if(a&0x08) StackPush(stack,1);
                else       StackPush(stack,0);                                       
        }
        for(i = 0;i<8;i++)
        {
                int d = 0;
                StackPop(stack,&d);
                if(i == 0)
                        if(d == 1) b |= 0x80;
                if(i == 1)
                        if(d == 1) b |= 0x40;
               
                if(i == 2)
                        if(d == 1) b |= 0x20;
               
                if(i == 3)
                        if(d == 1) b |= 0x10;

                if(i == 4)
                        if(d == 1) b |= 0x08;

                if(i == 5)
                        if(d == 1) b |= 0x04;
         
                if(i == 6)
                        if(d == 1) b |= 0x02;

                if(i == 7)
                        if(d == 1) b |= 0x01;

        }
       
        printf("\nb:0x%x\n",b);
        return 0;
}


执行如下:

微信图片_20200513192751.png

除了用栈来实现,群里有位同学的答案让我眼前一亮

#include <stdio.h>

struct charbits{
unsigned char data1 : 4;
unsigned char data2 : 4;
};


union dataChange{
struct charbits charBits;
unsigned char data;
}datchange,*p;

int main(){

unsigned char temp;

p = &datchange;

datchange.data = 0x34;

temp = p->charBits.data1;

p->charBits.data1 = p->charBits.data2;

p->charBits.data2 = temp;

printf("data is %x", datchange.data);

return 0;
}

微信图片_20200513192754.png

完美演示了位域、共用体、结构体、指针的几个知识点~

测试下位域的作用

#include <stdio.h>

struct charbits{
unsigned char data1 : 1;
unsigned char data2 : 3;
};


struct charbits1{
unsigned char data1;
unsigned char data2;
};

int main(){

struct charbits a;
struct charbits1 b;
printf("%d %d\n",sizeof(a),sizeof(b));

/*赋值1看看*/
a.data1 = 1;
printf("%d\n",a.data1);
/*赋值3看看*/
a.data1 = 3;
printf("%d\n",a.data1);

/*赋值3看看*/
a.data2 = 3;
printf("%d\n",a.data2);

/*赋值7看看*/
a.data2 = 7;
printf("%d\n",a.data2);


/*赋值8看看*/
a.data2 = 8;
printf("%d\n",a.data2);
return 0;
}


data1只能存 0和1,如果存其他值的话就会溢出变成0。

data2是 3bits ,只能存 0~7,我们存 8 进去,就溢出变成 0。

微信图片_20200513192758.png


收藏 评论3 发布时间:2020-5-13 19:29

举报

3个回答
radio2radio 回答时间:2020-5-13 22:28:10
看得都眼晕,不让移位,可是没说不能X16和/16呀,核心部分能一行代码搞定!

cloudcn 回答时间:2020-5-13 23:07:01
查表啊,占用空间与执行速度绝对快虽说建表时要用到移位,但没说不可以把表写到原代码里去编译啊
const uchar table[256] = {... ...};
result = *(table+convchar);
likang1202 回答时间:2020-5-14 10:41:55
一脸懵逼

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版