|
昨晚在微信群看到一个读者发的面试题目,从网上截图出来的,我百思不得其解,题目如图。 # w: W5 ?* h6 Z, v2 B
幸好,我学过栈2 {% R! ]4 x. `) M 然后我写了个小程序 / Y+ z h1 f: c2 B 第一个方法比较笨,当我写完自己的代码后,看到有同学发了自己的代码,我赶紧就发了个红包,一个是为了鼓励大家多讨论问题,一个是为了赞扬这样的行为。 第一个方法就是取出每一个bit,压栈,然后再出栈,你想怎么排序都没有问题。 6 e$ e1 N# P5 }% l #include "stdio.h"* d0 r* h# b! W#include "stdlib.h" . i0 y0 S. A8 w5 q+ | struct List{1 A; M, ]! B7 L7 M$ A K int data;! o# E7 A# ]1 B/ C2 `& y struct List * next; };# X, u# Y- P0 T0 L $ B& U& Y$ [0 L% M* z struct Stack{7 D7 z$ v4 ? m, M1 u: R struct List *head;4 g, U8 L8 k& N5 c% } int size;# U4 h5 B0 E; I6 K8 I1 L }; 6 V8 |8 H7 R" X 4 Q" v" w4 |6 q+ L struct Stack * StackInit(void)' F8 |# ]3 E* V { struct Stack *stack = NULL; stack = (struct Stack*)malloc(sizeof(struct Stack)); stack->head = (struct List *)malloc(sizeof(struct List));( H- I9 t% j" P! A H. c0 i0 u stack->head->next = NULL;+ P* T: a; k* v' P8 O1 |- _ stack->size = 0; return stack; } 3 q0 F& Z4 J3 s" k# s& c int StackPush(struct Stack *stack,int data) {" u) b4 u( c! G$ F struct List *tmp = (struct List *)malloc(sizeof(struct List)); tmp->data = data; tmp->next = stack->head->next;! ?5 r* g% I# @+ L0 } stack->head->next = tmp; stack->size++;% l2 u' A; x: ^9 s1 b" G9 R% ] //printf("push:%d \n",data);4 i! @3 U# u& l& s return 0; } 0 b0 v, E# ~7 N7 T/ ^ int IsStackEmpty(struct Stack *stack) {- k9 P; G8 n8 x! _+ J# J7 M if(stack->head->next == NULL){ //printf("stack null\n");3 U4 [. W* s+ F7 U return 1;. J: E+ z! ~- r B: {8 ^. z# f }else{2 Z8 T0 z1 _+ o6 [6 t- | //printf("stack is not null\n");8 B/ w/ ^9 W, E" Y" ~0 J8 w return 0;5 B# s3 V8 ~! q2 p( T' o" Y } } int StackPop(struct Stack *stack,int *data) { struct List *tmp = NULL; ~! {( C* u2 d# _ if(IsStackEmpty(stack)) return -1; ; p% t& I2 |' i' l) J tmp = stack->head->next;8 I, _5 F1 B- E2 l7 a *data = tmp->data; stack->head->next = tmp->next; stack->size--; if(tmp!=NULL) free(tmp); //printf("pop:%d \n",*data); return 0;/ G( X6 g- v$ M }1 L8 z; m; v7 c/ l8 U& q h : n! y6 M) g. \# ]* y! Q( f " Q3 l) r8 \1 j; P int main(void) {5 e' _/ i; }0 @: B/ f& { int i = 0;. x7 D! T5 {) K& H- b1 ~/ W' `$ t unsigned char a = 0x71;$ A5 ?- D: `3 Z3 W2 K+ P8 } unsigned char b = 0;- I9 u+ b" l' W, z+ ?5 T7 V struct Stack *stack = NULL; stack = StackInit();) ` R& W1 p! O# Z printf("a:0x%x\n",a);2 T$ z6 z4 s8 p f- J/ u: v for(i = 0;i<8;i++): v$ L4 K4 K! Y+ j# b5 A4 x3 }, I { if(a&0x10) StackPush(stack,1);/ l8 Z w' K! @1 k; H/ I0 Z9 \1 G) ? else StackPush(stack,0); if(a&0x20) StackPush(stack,1); else StackPush(stack,0);! E/ v5 j& Y/ n$ a if(a&0x40) StackPush(stack,1);. n* w' E. g9 r) z( k else StackPush(stack,0); k4 S% N1 N3 O8 `" |+ c/ t if(a&0x80) StackPush(stack,1);8 i, p1 ~: A. z& Z$ U: `- r1 R3 L else StackPush(stack,0);. {; J, o5 L7 \# C0 S' {- } if(a&0x01) StackPush(stack,1); else StackPush(stack,0); if(a&0x02) StackPush(stack,1); else StackPush(stack,0); `/ r" E4 h4 o2 S( S9 S if(a&0x04) StackPush(stack,1); else StackPush(stack,0); / {5 N7 g8 b/ ?; W3 W( I' p0 z1 T if(a&0x08) StackPush(stack,1); else StackPush(stack,0); }; W9 U, h$ y6 F1 k# q for(i = 0;i<8;i++)! b* w5 V- S" O. l$ n4 y {$ d) b/ K. a0 x3 }' j7 Q" [ int d = 0; StackPop(stack,&d); if(i == 0)' B l9 _0 F1 y+ G5 K- { if(d == 1) b |= 0x80;0 o+ `" j3 Y- j5 n if(i == 1) if(d == 1) b |= 0x40;5 ]+ B6 b+ F* C/ B; l ! g1 D f$ N1 D; T0 C+ } if(i == 2)5 E+ W1 l) ]* w: W# o, ^ if(d == 1) b |= 0x20;3 B/ h/ C1 \0 c/ R3 \& y6 c , e9 R+ ^+ {# ]8 s if(i == 3) if(d == 1) b |= 0x10; if(i == 4)% S9 s9 [3 }8 k9 u9 \0 c7 b if(d == 1) b |= 0x08;: h( W( R6 r; M) S& N1 v 2 }) k8 g/ z) U8 z% `5 m if(i == 5) if(d == 1) b |= 0x04;8 j- S/ u2 f0 y if(i == 6). G9 y' e3 r& N if(d == 1) b |= 0x02;" p$ i, Z% c' h) n! ~ . U; A3 [* t1 k/ I5 Z. S& v/ l2 z/ E0 [- k if(i == 7) if(d == 1) b |= 0x01;9 K" }+ y: \) J0 h , W% a# `: m5 A( P6 t7 W) |( J j }8 ^9 i+ j/ q7 m, q printf("\nb:0x%x\n",b);7 s7 ^; S5 G- O `& p5 W return 0; } 执行如下:
1 R7 s( H% C ]! W. I% K 除了用栈来实现,群里有位同学的答案让我眼前一亮 : _8 @8 Y6 Q# S1 o! W# e- | #include <stdio.h>" E! N! r, o3 s! r3 F struct charbits{ ^5 c. p% i7 v% |6 u C6 h# a unsigned char data1 : 4;, m' R @/ R( p unsigned char data2 : 4;8 s5 `! [4 p3 Q* M }; / S9 H$ Z3 U$ i+ O) e ^ 9 U$ R6 Y, ]- I; J e union dataChange{ struct charbits charBits; unsigned char data;* W* w$ _( F7 H4 s4 t6 G7 R }datchange,*p; int main(){( @. \6 q7 c! ~, {: x + x: k, q0 F3 b* f; ^; n unsigned char temp;# A8 U) f% a1 a5 @/ \ p4 H / H9 H& V3 C8 b/ I3 |3 Q p = &datchange; - g" F0 |7 s6 |: [ datchange.data = 0x34; temp = p->charBits.data1;0 w* T$ t( X3 t p->charBits.data1 = p->charBits.data2; p->charBits.data2 = temp; printf("data is %x", datchange.data);( u; t( |4 M$ q7 z4 P0 ^ ; R. T' x! I' q# D( v# _1 m return 0;5 z2 k% W* ]1 x }0 V F( F$ C. v/ [- r( d) k$ l$ Y6 V
; ?1 c& y: @7 k% N$ O6 @ 完美演示了位域、共用体、结构体、指针的几个知识点~ 6 j' a3 e, r9 X0 M4 D9 w 测试下位域的作用 2 D5 |7 P: @# p. d# Z1 {8 Y1 s struct charbits{5 h4 `4 q4 N# R( s$ K) R- l unsigned char data1 : 1;6 A* s0 [; j5 P/ Y) W5 M5 N# t unsigned char data2 : 3; Z" f# N* R- i# \4 R9 k }; struct charbits1{ unsigned char data1; unsigned char data2;' z# a3 Q/ P' O };8 I* ^5 L: s L, X' x6 e int main(){ . v8 ~4 ^! H [/ [ struct charbits a; struct charbits1 b; printf("%d %d\n",sizeof(a),sizeof(b)); : O# E9 I8 |8 M; c( }) [ /*赋值1看看*/3 ^4 D& f3 H+ M8 V; K1 T a.data1 = 1;; t2 D5 J9 p8 B- t, N printf("%d\n",a.data1); /*赋值3看看*/ a.data1 = 3;) F' `. q! N* {& m) @ printf("%d\n",a.data1); /*赋值3看看*/) Y5 l9 s q! y a.data2 = 3; printf("%d\n",a.data2); ( e' z5 M6 u7 d @ /*赋值7看看*/; v0 \$ @( e& T& _% h% X: Y a.data2 = 7;- s5 P. M, Q& _- z6 M- R( u printf("%d\n",a.data2); /*赋值8看看*/ a.data2 = 8;, B |" b+ ^0 T printf("%d\n",a.data2); return 0; } data1只能存 0和1,如果存其他值的话就会溢出变成0。 9 v0 }9 @* X/ X! N6 W8 X* e data2是 3bits ,只能存 0~7,我们存 8 进去,就溢出变成 0。 ! x8 b9 p* g) m' v2 E* T* a
|
微信公众号
手机版
const uchar table[256] = {... ...};, w$ @8 G( P+ p3 q# V- O
result = *(table+convchar);