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

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

[复制链接]
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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版