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

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

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

& O8 }0 t: [' F" v
幸好,我学过栈2 {% R! ]4 x. `) M

6 A; ~* y# X, R; S- T) G
然后我写了个小程序
/ Y+ z  h1 f: c2 B
第一个方法比较笨,当我写完自己的代码后,看到有同学发了自己的代码,我赶紧就发了个红包,一个是为了鼓励大家多讨论问题,一个是为了赞扬这样的行为。

4 x  H9 a+ \2 V+ i5 v  z" b6 @
第一个方法就是取出每一个bit,压栈,然后再出栈,你想怎么排序都没有问题。
6 e$ e1 N# P5 }% l
#include "stdio.h"* d0 r* h# b! W
#include "stdlib.h"
: k! U+ s9 v# {& x# D4 J. 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;
9 K+ l: Q; V' b* h, N* l' `};# 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
};
' n( b  K9 A( z: M6 V8 |8 H7 R" X
4 Q" v" w4 |6 q+ L
struct Stack * StackInit(void)' F8 |# ]3 E* V
{
% Q* i- X9 n, M% A: Z' v! \        struct Stack *stack = NULL;
( J: V8 x( ?+ F8 H7 f        stack =  (struct Stack*)malloc(sizeof(struct Stack));
4 e& P4 _" M; l/ H        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;
4 U% r3 z4 l/ ]; e$ s        return stack;
' B6 D2 l5 c' G4 J  j}
( i9 S% M. n' Q8 h3 q0 F& Z4 J3 s" k# s& c
int StackPush(struct Stack *stack,int data)
: Z3 m$ Y) J0 M# p- a* F{" u) b4 u( c! G$ F
        struct List *tmp = (struct List *)malloc(sizeof(struct List));
+ w. p3 \1 ?& R8 ]9 ?8 z) {        tmp->data = data;
* j: X$ J( [  {1 s; j6 g8 s        tmp->next = stack->head->next;! ?5 r* g% I# @+ L0 }
        stack->head->next = tmp;
; c! r- u) L3 p+ y( \        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;
! L- r$ h: s, P' |( P}
5 ?4 |& B; M/ g" y0 b0 v, E# ~7 N7 T/ ^
int IsStackEmpty(struct Stack *stack)
' {+ g- m2 b$ |* `, v7 X{- k9 P; G8 n8 x! _+ J# J7 M
        if(stack->head->next == NULL){
4 K0 j% d- L  k  w' O3 J                //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
        }
2 }+ B2 O% n- b* b}
& z+ ?4 v* e; |: O7 {7 F
, |" x: H: K. Zint StackPop(struct Stack *stack,int *data)
- O: }. W% |, H6 X) f" ?{
* |6 P. e% O) Z5 s        struct List *tmp = NULL;  ~! {( C* u2 d# _
        if(IsStackEmpty(stack))
1 k  c6 e2 ?0 m* v9 @; x+ w                return -1;
# _# \- |3 X6 Q) q6 G                ; p% t& I2 |' i' l) J
        tmp = stack->head->next;8 I, _5 F1 B- E2 l7 a
        *data = tmp->data;
: x- Y' @8 N) T: `0 @+ A+ z        stack->head->next = tmp->next;
9 o$ s( J6 q5 h$ C0 s  f1 w        stack->size--;
0 E7 d  K! j; ?' I/ q& P9 \2 y        if(tmp!=NULL)
& [6 Q7 x& \- y                free(tmp);
) F# e1 m9 A$ ~% v/ y6 T       
8 e! x9 J2 x- B* {, \        //printf("pop:%d \n",*data);
" M- s: [5 k  C: L: T* I$ h. R        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)
* {- U4 d1 S0 ]% _5 x# q{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
       
" a$ t$ r6 |( b$ w6 _3 ?1 {. I        struct Stack *stack = NULL;
) T4 b$ X* |6 g! I4 E9 w        stack = StackInit();) `  R& W1 p! O# Z

  V0 z+ p. `# u2 Q9 b7 L" q        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
        {
* D, D$ V$ w! @8 K; p% `$ v6 C( C
" d# z: _) j8 L2 J2 O  t                if(a&0x10) StackPush(stack,1);/ l8 Z  w' K! @1 k; H/ I0 Z9 \1 G) ?
                else       StackPush(stack,0);
: e3 k3 d  ]. D6 k; Y2 Q3 m* ^* s                if(a&0x20) StackPush(stack,1);
/ @0 M% J, T# H- r- I& w, k                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' {- }

* |7 N: a, I% b: N                if(a&0x01) StackPush(stack,1);
5 X3 k; J5 e( D2 T" I* E) g                else       StackPush(stack,0);               
" Y- y0 h! E6 b% R3 d                if(a&0x02) StackPush(stack,1);
6 [6 s* |3 r3 F3 Q4 S2 I                else       StackPush(stack,0);  `/ r" E4 h4 o2 S( S9 S
                if(a&0x04) StackPush(stack,1);
/ i: x3 @; `: @7 Y                else       StackPush(stack,0);        / {5 N7 g8 b/ ?; W3 W( I' p0 z1 T
                if(a&0x08) StackPush(stack,1);
# J' }$ D* R7 x2 \! W- s                else       StackPush(stack,0);                                       
. K/ s( a( E. T/ ~        }; 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;
8 w( G) T: X) q3 P) R0 d                StackPop(stack,&d);
4 d) m4 J. D6 i1 F( L                if(i == 0)' B  l9 _0 F1 y+ G5 K- {
                        if(d == 1) b |= 0x80;0 o+ `" j3 Y- j5 n
                if(i == 1)
6 a/ S2 H) v* p0 n& C) R                        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)
, j  B# L! D+ r& }9 g$ j                        if(d == 1) b |= 0x10;
+ m: e! y9 [) y$ v
- s1 _8 a2 j1 h/ R                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)
- y; Q  K) q- c% r- R3 Y3 ~# H                        if(d == 1) b |= 0x04;8 j- S/ u2 f0 y
         
$ b) S" B: x9 g0 c                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)
4 @1 U) g/ }- Q* ?                        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
       
& m: L7 b' q" w7 c" U        printf("\nb:0x%x\n",b);7 s7 ^; S5 G- O  `& p5 W
        return 0;
8 S, k( K" @; `* o  ]}

# {9 |* ], {1 P

" h4 [. P3 [) H2 `4 r% C2 [
执行如下:

' \$ x( _8 d1 X! b# {( G
微信图片_20200513192751.png
1 R7 s( H% C  ]! W. I% K
除了用栈来实现,群里有位同学的答案让我眼前一亮
: _8 @8 Y6 Q# S1 o! W# e- |
#include <stdio.h>
/ }  b7 ~/ Z+ z" 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
};
7 W& Q/ E' o, _9 W2 u/ S9 H$ Z3 U$ i+ O) e  ^
9 U$ R6 Y, ]- I; J  e
union dataChange{
' |' M8 I/ l9 V% v1 T$ ] struct charbits charBits;
) G! K$ g: T8 [. E9 r+ ^ unsigned char data;* W* w$ _( F7 H4 s4 t6 G7 R
}datchange,*p;
: u: f6 I; j+ x' i0 I, t
+ z- I( @! L5 o" n2 F& Y* X' `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;
" a. j5 n1 @3 }2 N9 s3 K- g" F0 |7 s6 |: [
datchange.data = 0x34;
" N: T5 F9 ?' ^3 p2 m1 H
& L. B; w! o. d: S0 Y. U temp = p->charBits.data1;0 w* T$ t( X3 t

; p* x" Z* ?+ N" @# r p->charBits.data1 = p->charBits.data2;
7 v( z3 W* C+ o# v1 @9 b8 Z
7 o1 `6 |* F$ @! Y$ L- G/ E p->charBits.data2 = temp;
5 q, J7 V% u6 t" Q
  A: a; i" J+ i5 z, ^% ?( n 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
微信图片_20200513192754.png
; ?1 c& y: @7 k% N$ O6 @
完美演示了位域、共用体、结构体、指针的几个知识点~
6 j' a3 e, r9 X0 M4 D9 w
测试下位域的作用

, Y) i5 U  B! o  S9 _, U
#include <stdio.h>
3 ^7 U' z* b& S$ r9 `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
};
/ E: j6 _4 @. y
- t3 F3 Z; K2 k4 X8 d# x- ^- Q
& i, m% [# b/ k7 ~; d" H: @% Fstruct charbits1{
- r; a% U" Z9 k3 O' {/ F" w6 T& ? unsigned char data1;
, t( x' M6 }. [6 f- v0 U0 k unsigned char data2;' z# a3 Q/ P' O
};8 I* ^5 L: s  L, X' x6 e

, b- {+ e* T6 k2 d+ Fint main(){
9 y) w9 H) q, R! ]) ]6 q. v8 ~4 ^! H  [/ [
struct charbits a;
1 I' H/ x) g) Z* ? struct charbits1 b;
" E/ F+ ^* H# l( ^4 X. u5 G printf("%d %d\n",sizeof(a),sizeof(b));
) A6 J3 I! Z; A4 K& b* n1 U% p : 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);
/ C8 r# J& D5 P6 z6 w3 Z' o( D& ]! _3 ] /*赋值3看看*/
# h/ a" v* N  ` a.data1 = 3;) F' `. q! N* {& m) @
printf("%d\n",a.data1);
" i9 n- h  F. P: C; w: c! H
6 c% ]0 R& C3 k" a /*赋值3看看*/) Y5 l9 s  q! y
a.data2 = 3;
$ l; i% a+ h$ ]' B6 Z# Z% B printf("%d\n",a.data2);
) r' Z4 V6 e" `, t- ?( 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);
. n0 A( m1 _4 s
- f* f; g% M6 C$ b, R, P
! v6 h$ O, U/ J: i2 W; K /*赋值8看看*/
) T+ `4 I+ L  s# X0 a a.data2 = 8;, B  |" b+ ^0 T
printf("%d\n",a.data2);
' g5 ~. A: ]0 j7 Z- e return 0;
; Q+ K% b6 ?5 @  x$ ]}

6 n$ L7 }. D& W  B

8 R: C* @' K5 U5 s! U# ~
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
微信图片_20200513192758.png
! T) M! S; B8 i6 ?! {' s/ B

: H/ ?7 w; i& w5 b0 i! n* D  W
赞 收藏 评论3 发布时间:2020-5-13 19:29

举报

3个回答
radio2radio 回答时间:2020-5-13 22:28:10
看得都眼晕,不让移位,可是没说不能X16和/16呀,核心部分能一行代码搞定!
2 U! |  w/ D% w  {1 R0 n8 k
* h% Y# S" o7 u" _! ?: l9 q
cloudcn 回答时间:2020-5-13 23:07:01
查表啊,占用空间与执行速度绝对快虽说建表时要用到移位,但没说不可以把表写到原代码里去编译啊6 Z0 N: S( W, p' Y) F8 T; {
const uchar table[256] = {... ...};, w$ @8 G( P+ p3 q# V- O
result = *(table+convchar);
5 E/ Z2 I4 b5 o: ?7 v5 o: B
李康1202 回答时间:2020-5-14 10:41:55
一脸懵逼
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版