用指针实现高低位倒序,疯了吧
生活随笔
收集整理的這篇文章主要介紹了
用指针实现高低位倒序,疯了吧
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
昨晚在微信群看到一個讀者發的面試題目,從網上截圖出來的,我百思不得其解,題目如圖。
幸好,我學過棧
棧,C語言實現
然后我寫了個小程序
第一個方法比較笨,當我寫完自己的代碼后,看到有同學發了自己的代碼,我趕緊就發了個紅包,一個是為了鼓勵大家多討論問題,一個是為了贊揚這樣的行為。
第一個方法就是取出每一個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; }執行如下:
除了用棧來實現,群里有位同學的答案讓我眼前一亮
#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; }完美演示了位域、共用體、結構體、指針的幾個知識點~
測試下位域的作用
data1只能存 0和1,如果存其他值的話就會溢出變成0。
data2是 3bits ,只能存?0~7,我們存 8 進去,就溢出變成 0。
? 回復「?籃球的大肚子」進入技術群聊
回復「1024」獲取1000G學習資料
PS:想加入技術群的同學,加了我好友后,就給我發「籃球的大肚子」這句話,有可能機器人打瞌睡,可以多發幾次,不要發與技術無關的消息或者推廣。
總結
以上是生活随笔為你收集整理的用指针实现高低位倒序,疯了吧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python知识点之Python进阶
- 下一篇: 浅谈ARM架构芯片