找回密码
 注册
关于网站域名变更的通知
查看: 315|回复: 1
打印 上一主题 下一主题

嵌入式基础知识之逻辑运算

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-17 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
嵌入式基础知识之逻辑运算
4 V3 j  U' l1 k: i6 D% i- I# v  r& l& \- P1 A# X; n
. h+ j. _  ?1 O1 R; S/ c9 R
使用一串0或者1记录数字的方法叫做二进制
1 O; L9 Y6 f# a* L计算机里只能采用二进制方式记录数字  6 R$ m" ~3 h1 T- t$ m
任何数字既可以采用十进制方式表示也可以采用二进制方式表示
8 C$ K$ T/ {9 f. Z0 t3 o在数字的二进制表示方式中每一个数为有一个编号,最右边数为的编号是0向左边一次递增; ?2 O8 x. a! s; E
每个数位上的1代表的数字可以根据2的数位编号次方计算得到+ r, t! a$ |; m, T7 ]
如果两个相邻数位上的内容一样则他们代表的数字之间有倍数关系,左边数位是右边数位的2倍; c; V7 Y& n) ~) H- M1 j8 g
用二进制方式表示的非负数符合上述规则
5 J/ y8 l1 J( k  h( s# ]: `- \2 X8 K二进制加一时把最后右边的所有1都变成0把最右边的0变成1
+ i9 K1 {) V5 n& I  d
$ D, I7 a/ h, S' u" u
5 i# j4 T: h8 x6 @0 v7 f
非负数的二进制转换成十进制的时候之需要把其中每一个1单独转换,然后把转换结果求和
- u  r! [+ y0 T# R! a5 X% I0 y* Q2 d例 0000 1101=2^3+2^2+2^0=13  L3 W" e1 j: I$ P' ?- i& t: d

4 i4 \2 C5 U8 j* l" B! U& z# c- ?# M
1 Q( N" s- z! z( Z. `7 J4 u- e
非负数十进制转换成二进制的方法; e. ?, t7 D6 ^3 _
不停对数字进行除以2取余操作,把所有余数按倒序书写就得到转换结果
* R  ?. b1 b# o* ~" Q例 **** ****  12 (12)! f' n) o/ d. B! W0 F
**** ***0  12(6)1 L- u7 o9 s$ I9 t; Z) Q2 k+ l
**** **00  12 (3)
' Q1 D# F& P8 }! h* ]**** *100  12 (1)
+ P7 `9 |5 m6 m**** 1100  12 (0)6 B7 g% w8 y$ ^* r8 O* A
0000 1100  12
( C( P; F' o8 W# _! }5 a: @% m) k5 n, w$ W' T9 g, V

- `5 ]! i1 K/ J% L1 h1 ]0 u3 g例 9转换成二进制  为 0000 1001
) \. @9 c  c. |# }/ P' s6 P* ]0 u: q8 u3 H$ ]6 W2 W& a
, N# Y. M5 a/ g! j( e- @
56 转换成二进制为  0011 1000  
: f1 \: [( m- }0 S, X2 m, X
, C6 g& T3 D! x* u/ W
5 @6 E! H! K& \. p. E" r2 w! H
负数十进制转换成二进制的方法      0 C" ^% G# t9 {5 \. X0 A
1 首先计算处出反数4 x( x$ r5 j3 m
2 把第一步的结果转换成二进制1 T1 I0 S6 P' B' Y, K
3 把第二步的结果每个数位变成相反内容
) ~5 h8 h8 K) c8 x) n  H) W3 c: ?/ h4 把第三步的结果做加一操作7 x1 V' J/ O4 M  t- P' e4 j7 R

, y8 x. S0 \5 u* m/ U- q
- w: r/ ~( W5 G7 A1 i
例 -5  二进制为 1111 1011             十进制数之间转二进制 关系是  取反加一; z8 R' F, R2 z+ k9 H6 i
1 5的  二进制   0000 0101. M! Z+ X* q5 [# F& U+ S" e
2 取反          1111 10105 V' V4 j( D/ C0 J
3 加一          1111 1011
  ~9 o3 h& F5 X! {
8 s4 e( q! C: o" Y' I' z) |
7 W; I! i! k) q/ ?
-56 转换成二进制为 1100 1000   200也行 如果符号位是1就表示数字是负数******
, E3 {, J- J! i& d. g3 H( G互为相反数的两个二进制表示方式,根据其中任何一个计算另一个都可以采用同样的办法2 b& [7 e  g4 f( g' m5 E
有符号类型那个最左边的二进制数位叫做符号位0 \2 h2 C+ H" H. l3 H9 o
如果符号位是0 就表示数字是非负数,如果符号位是1就表示数字是负数+ R; b9 d2 H8 T" L0 G7 `0 [- I
负数的二进制转换十进制
: c% e6 ^4 r0 X' c( y* D6 h1 计算出相反数的二进制     注意加一
7 ]' J' j: k$ s1 G' Z3 x& _! E2 把第一步的结果转换成十进制
2 z0 j0 k3 l" C2 R* v4 c3 把第二步的计算结果再求相反数    @@@@@0 M# v) i: \" D3 z, Q

7 `1 \% _: G' M2 G7 [" e% V
' @1 M, U2 i8 W4 `: B5 F
例 1111 0110 转十进制为  -10                  二进制数转十进制 关系是取反加一加负号
9 V1 r& t* Y1 P4 E6 T9 v9 D) F; ]1  取反加一 0000 1001+1=0000 10104 F$ E% h- ~) Y/ z( v- u2 K
2  结果     10$ H  q+ w  v# g8 w. \) o
3  十进制取反   -10
9 L, u2 k3 P! v7 |
+ ]8 N/ r4 z2 g. p5 _" c8 L" R

  [' A" d1 b/ O2 A. g把二进制从右向左每三个数位分成一组. P) J8 }1 Z9 E8 y
每一组单独转换成十进制结果一定在0到7之间。
) F' k; U5 c( H& w4 m! X, F6 @把所有组的转换结果按顺序书写就得到数字的八进制表示方式) ]3 C9 F4 O8 N+ K' `
例 0110 1010 转换成八进制为  0152        转换成十进制为 106    转换成十六进制为 0x6a) F+ x" G- i6 }  x- w# M( ], N. ]
先按三个一组分组 01 101 010  得0152          问 B D H是什么?
+ s. Z6 H3 D9 p# m可以在程序中用八进制方式表示数字必须以0作为开头
- w3 l1 f# r- Y4 p7 d4 B, j; X- j( F采用%o作为占位符可以把一个整数的八进制表示方式打印在屏幕上" i& p2 y# f" M

1 ]; J& ^  h% ~

2 k. j0 M; ~  \7 `8 e把二进制数字从右向左每四个数位分成一组,每组单独转换成十进制一定在0到15之间$ z+ E' G4 e4 \
如果转换结果在10到15之间用英文字母a到f分别表示
7 ^# ^% [: a% \& [. l把所有转换结果按顺序书写就得到数字的十六进制表示方式8 C7 ?4 A+ d- I/ {: _3 B
例 0110 1010 转换成十六进制为 6a  ; K1 x* A8 l& z8 y
例 0010 1011  43  053   2b
( l5 q  d1 S3 r. b# `( `$ M  N0 }7 N& j1 {
% h* y2 m! h" w0 Z1 w# E" D0 E. X
采用%o作为占位符可以把一个整数的八进制表示方式打印在屏幕上   o153  八进制
6 P, [. X7 T6 J. }0 w; U' I; L可以在程序中使用十六进制方式表示数字,必须以0x开头   @@@@@, Y+ W: a( L+ E: R/ U' q
采用%x或者%X作为占位符可以把数字的十六进制表示方式打印在屏幕上4 S3 A) z. i( e3 f8 M( ~
打印结果中不包含0x
) L0 `& |2 y2 {% D% T+ h! a' \%x做占位符的时候打印结果中的英文字母都是小写的0 i9 U6 |, W% W' h
%X做占位符的时候打印结果中的英文字母都是大写的
& S3 T3 n: ^- H& b. n- @0 l, S8 v; C" v2 {8 y! ~7 u8 e. a% W
6 W$ n# ?$ A* m
自增操作符(++)和自减操作符(--)都是单目操作符,他们可以把一个存储区里的内容做加一减一
" U4 N# v9 Y# [7 _8 r3 Z- M这两个操作符必须和存储区配合使用/ I% F2 ]' J& f6 e0 N! L- i
num++  和  ++num1 R9 {$ E- U' i4 g' B; O% X5 H
这两个操作符都有两种使用方法,后操作(操作符写在变量名称后)和前操作(操作符写在变量名称前)
- n) x3 ]3 o* t  M$ b3 v& A; @不论是前操作还是后操作都可以把变量内容加一或者减一: O2 ^1 [5 \; h5 v2 \1 [
这种表达式可以当作数字使用,前操作当数字使用的时候是修改后数据,后操作当数字使用的时候是修改前的数据* W, T* o/ {' }) \
不要在一条语句中对同一条变量多次进行自增自减计算,因为结果不确定9 F9 R4 k7 B+ V0 F+ x
) Z7 l  e; `( c
: t& r" `. K) J3 c7 o
" g$ v; y; h$ l8 G
num=10;              num=10;; ?3 d# B$ p8 Q1 n* o
num++;//num=10       ++num;//num=112 C* h1 a$ o0 S& @4 X* p/ c
num=11 num=11  , y# S) Q  R4 Q7 R- }  U6 v
, @$ }8 ]9 e' o' M

! \& T. j1 R+ a- Y3 R后操作               前操作
' V1 S! Q/ f2 ~  g3 D4 v
  Q2 S# r: I4 g, q: O, w
9 [, H! N$ o7 U$ ?8 ~
num1=10;                     @@@@@
* q5 Q2 l% |- Q' Cnum1=num++ + ++num;  
" {3 Z' t9 r& p8 R8 Bprintf("%d\n",num);  //233 H( L: O: a, e

' ~7 D9 b" r5 f+ H+ l
6 d: v# Y* d- ~3 R* G5 ?
运算符的优先级
' e3 r0 e$ z4 h; \单目高于双目
& m+ y3 p! P, f2 e* L4 B8 R" n/ `乘除高于加减( ~3 g! h7 V& S  X
算术高于关系高于逻辑
  }/ @1 L2 w7 y1 q1 Y1 h. v3 q条件高于赋值高于逗号% Q+ I" I; Q9 O6 S" c2 |# C$ g* ]

3 _, u8 E: k5 q
, T/ x; Q# [) t+ Q" \+ A
优先级  类别  运算符
9 K8 ]/ L2 Y  r2 K12 初等运算 ()、[]、.、->6 P* Z5 p* `+ V; M. d
11 单目运算 !、~、++、--、-、类型转换、&、*、sizeof
/ ^. W8 ~. B* j+ J10 算数运算 *、/、%高于+、-
$ A: |1 ~% @& {9 移位运算 >>、<<( H9 {- g' z! i( F# M7 N1 I
8 关系运算 >、>=、<、<=高于==、!=4 s5 E# D% J1 c
7 位与运算 &
2 {$ h: f. T% K8 z6 异或运算 ^
# \# S( s( _7 O; P/ }5 位或运算 |
( u, a4 K" B2 N- N4 逻辑运算 !高于&&高于||
/ l4 T3 J+ R- M5 S5 W8 ~! N3 条件运算 ?:
( _: V% t& m7 f( c. U8 T0 Y2 赋值运算 =、+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=
: f& k% I* U3 ]0 {1 逗号运算 ,! X; C( R: u4 W  a2 X
  w  R. F. ~8 [9 V) o+ J0 o2 G

& L4 Z( Z) {; P6 q3 p! r# y$ q运算符的结合序
  o+ Y0 m; G& B; k) d, f' e+ e多数运算符具有左结合序
/ k0 G7 o; ]- r" f  la-b+c 等价于 (a-b)+c+ [$ @* {, j! I- t3 {
单目、三目和赋值运算符具有右结合序
' F  u; X8 U1 r, w" Q-----a 等价于 -(--(--a))
8 J3 U$ R9 `3 C0 w' U, C( H0 \a>b?a:c>d?c:d 等价于 a>b?a: (c>d?c:d): ?& b0 g5 J( X8 u% f. X+ k
a=b+=c 等价于 a=(b+=c)
9 I: L* k* A# C5 ~
* G# w4 E* K+ b& U. h% ]* T+ z
# q) P+ m# ^8 c, C1 G* j4 k
%i 和 %d 的区别) W$ f+ }) Y- Q$ ^+ v8 M
在printf里面没有区别3 H) P8 G1 r3 ^# r6 F
在scanf有区别  %d只匹配十进制  %i匹配 十进制 十六进制 %x %X 八进制 %o
. [1 w  |( j- k" y# C; D& F- ^( n
+ ?% W! R. V7 B+ A# a' t5 f  M1 v* X( M2 c

" r+ Y- x- p# P/ R  l3 t' X" E3 J" Z" Q用逻辑操作符编写的表达式叫做逻辑表达式    // num<=4     7>5* m; t  ~" J4 k# e3 W
逻辑表达式的计算结果一定是布尔值(真或者假) 1 X7 g7 i! Y7 F; S# H) }; b+ e
!是个单目逻辑操作符,他表示求反操作   0为假所有整数为真      
* p# P  x. {$ d- {这个操作符应该写在一个布尔值的前面$ ^4 b- K4 \9 q
他可以把真变成假,也可以把假成真7 W  z( C+ z0 F! W( y+ b
双目逻辑操作符包括==(等于),!=(不等于),>(大于),>=(大于等于),<(小于),<=(小于等于)  //注意逻辑表达式和运算表达式的区别) g' ?; n: w- a. u; j' S4 H
如果一个逻辑表达式中同时包含多个双目操作符则它们之间会互相影响
: [5 a2 n: T( G0 o* s( g6 k最多包含一个双目逻辑操作符的表达式叫做简单逻辑表达式
) x$ M  Z  c9 I复杂的逻辑表达式可以使用与(&&)和或(||)合并多个简单逻辑表达式得到) B. c" a! G/ w1 F
如果两个逻辑表达式中至少有一个的结果是真则用或(||)合并后的逻辑表达式结果也是真
- t, B. \$ ~2 f. S  H1 P& t# |0 k5 S只有两个逻辑表达式的结果都为真用(&&)连接后的结果才是真
+ ~9 Y, e1 R! f/ S或(||)和与(&&)都具有短路特征,如果前一个逻辑表达式的结果可以决定整个表达式结果则计算机会忽略后面的逻辑表达式+ g2 p( N. Z1 ^  E
短路特性具体为   @@@@@8 V3 {9 a* F7 Y& r" u
表达式一 && 表达式二 如果表达式一为假,就不会进行表达式二的计算! g! t' i2 `- \( ]% f9 g$ O7 g
表达式一 || 表达式二 如果表达式一为真,就不会进行表达式二的计算
8 n+ J6 T+ C  ?
6 P- _' ^  U7 u3 \' ^% Y" A
' p# j! b5 c/ H8 V# f( d7 d: q! W
逻辑表达式的值是真和假,分别用1和0表示  //布尔值
. ?/ m% [, K' E& _: [$ d6 q# U7 Y; d短路与:若第一个表达式为假,则结果为假,后面的表达式不再计算2 h6 d4 ~4 u8 H) r2 ?$ _
短路或:若第一个表达式为真,则结果为真,后面的表达式不再计算
6 G+ O) K% T7 W
9 l! u2 g( v# Q" m) p3 e
. \; E% d+ W8 {' A1 E
位操作符可以直接操作二进制数位
/ U% W) t3 m# i1 V
  [+ {' `& K( ^* X4 v* R
0 B1 u* R5 p6 V# U
~是一个单目位操作符,他可以把一个二进制中的每一个数位变成相反内容# k: y5 {) {4 P! `( n/ n
这个操作符叫做按位求反操作符
8 o' r2 N* |! R1 K~1011 0010  ————0100 1101   ~按位取反 //正数为原来的数加1 取反    负数为原来的数减1取反  @@@@@6 K7 D3 S2 P9 \! x
~6 0000 01100 c" E5 V- d3 n0 d. S# h+ l
  1111 1001 = -0000 0111 == -7# _1 H2 \6 A! {* [4 Z9 B* E; v8 C8 Q
~56 0011 1000
* w8 |# g" Q' D; d: m    1100 0111 = -0011 1001 =-579 `' O& u8 J& i/ k7 t
双目位操作符包括&(按位与),|(按位或)以^(按位异或)
1 ?, U7 z5 I# D, i& m) B他们可以把两个数字的对应二进制数位进行计算0 z1 Y' Y& p  N( u  `/ }- R5 r
按位与把对应数位内容做与计算   &
3 y2 }; s4 J+ ?  T3 `$ T只有对应数位上都是1的时候结果才是1/ a) U* n1 p9 B* L" _7 V
: m0 P$ A% t, y7 I( V
" n6 g. U7 J3 S) {- m5 s( a5 J( m
3 二进制     0000 0011    &按位与 @@@@@# e4 p: j6 k; m, i! p
5 二进制     0000 0101# ]( ?2 M9 t" R- u- x
按位与  & 为 0000 0001
6 {8 I& `+ m+ x, c* k  C' |结果是 10 l  z" v* [7 F7 |4 E) M

0 k( ^+ P9 F* F
0 _8 U2 `7 ]# U. u0 f# i) R
5  0000 0101! F2 I1 n( N% F0 h2 x  x- @$ X
6  0000 0110/ F- n9 R% U9 S2 x( V# F& X' `
   0000 0100 ==4
, `* c/ X( B$ G% \- T
' i' {. B5 ~1 S7 _
/ W, g( Y( j2 J
按位或是把对应数位内容做或计算   |
+ }- k( l: C" Q# e2 C只要对应数位中有1则结果就是1
; @. Z) ^$ r7 ?; r3 p% t
  T+ p; c5 D: e( I8 F/ I

" M  f# [9 A, n" y/ q/ o% U3 二进制     0000 0011    | 按位或 @@@@@! d1 z6 _0 k+ C( y
5 二进制     0000 0101$ e; M' o$ w! {( M- t  U
按位或  |  为0000 0111! z  [0 {' n9 W, q) z* R# L4 H
结果为 7/ n" ^7 K7 x. S7 e& U, V

1 h, A1 F, t4 L0 y0 g

4 J2 ^1 \4 b  e' T/ |1 @3 o: C5 0000 0101
/ o+ m, e3 P( X- C6 O6 0000 0110
% s- r' }& ]1 M; i( |1 G, V  0000 0111 ==7
3 f6 V( C! C4 X2 j
; ?) U$ B# B4 W" @& m

' P, n1 V1 R( T0 A# U: y& C; U按位异或把对应数位内容做异或计算
& E& ^# U; ^/ P  o* o1 Q如果对应数位内容一样则结果是0,否则结果为1   5 a3 D1 l! `: ]. }
) l2 V; ~- r% ?: x3 O8 L5 x) Q

% Q( u+ \% C7 I/ C3 二进制    0000 0011   ^按位异或 @@@@@
/ T* k/ A5 y% p5 二进制    0000 0101
7 [7 |- R- b+ O. B. c( [% F按异或  ^ 为0000 01101 j9 T" I2 ?3 M4 _( p! i- j
结果位 6
* X# R8 z9 e8 Z% Z( M6 O+ E) n7 d8 N4 D& ^! a- I

% Q; {# K( a/ P5 a3 @6 R- u5 0000 0101
: R# R7 V9 m+ g6 0000 0110
4 r& E  J# M) P% T  0000 0011 ==3
% V) [2 A% a# ]! [5 z' i
, S7 R7 q& g% ]2 N

  |+ ~, p" T7 [, a移动操作符可以把数字中每个二进制数位统一想左或者向右移动n个位置2 y/ r0 S; K* D! S  S
移动操作会得到一个新数字,不会修改原来的数字
& k+ z: P3 N4 D! h( T>>表示向右移动操作
( b' z- y: ~3 X" C! F<<表示向左移动操作* p2 m9 T6 `, S- N' t( ]8 _, O

& v: }3 A8 W# R/ s% F( W

5 R: P6 h3 g  v操作符左边的数字是将要进行移位操作的数字    # I% M/ k! M7 E, m) Z/ P7 e8 c, A9 A
操作符右边的数字是移动的位数
# g% S& U4 s- R( z+ ~向左移动是右边空出来的位置上一定补充0. x; @3 S3 a: B  M7 W! A
例如 3 二进制  0000 0011  向左移动两位结果为  0000 1100
+ |  t6 A( f  g3    0000 0011     2^2=4*3=12
8 R3 c+ Y* i1 ?( \     0000 1100
, }6 v( ]0 N. E: C( ]结果为 120 p7 y5 p/ q: L8 T7 r+ e. {. G* K$ ~. y

# i0 g4 ?" f& g

! H" @  j6 O* X, g, tff   1111 1111 1111
" }- r; y4 D1 Y4 v6 G     0011 1111 1111   . h  m- _$ p. {. Y- q1 I
结果为 3ff * G2 q3 X4 S2 d8 E
                         , L/ }- E! b! `* d
无符号类型右移时左边补充0,有符号类型右移时左边补充符号位的内容5 v; d# n4 t; D# e) C5 S) v2 M: U6 q
一般来说向左移动n位相当于乘以2的n次方,向右移动n位相当于除以2的n次方   //相对于有符号类型而言  
! M; f/ Q9 y+ l/ X$ _3 p
8 w( P/ P" ^6 I6 @

$ V, y  s0 B4 ~+ `2 U5 G3 Z三目操作符可以在两个不同的计算机规则中选择一个
- |! G  H( }5 G- V1 E三目操作符的格式如下, X  O7 U% b. a' |9 s# B
布尔值 ? 公式一: 公式二            5 U7 P; ?: z( f' w" l: n  o$ m
//布尔值需要有定义的  ret=(num >=0) ? num : 0-num;
* t$ o* p( _  ?7 ?) g如果布尔值为真则采用公式一计算结果
; I8 ?2 R: F/ J: E7 Q3 \如果布尔值为假则采用公式二计算结果
4 z6 o: n8 k: z/ }2 b' J9 k; P/ R8 ^0 G8 E7 M* |+ `
' n2 W! E: ?  \. m+ P- E" b4 q( p3 ^9 i
  • TA的每日心情
    开心
    2023-6-1 15:13
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2019-10-17 13:34 | 只看该作者
    这是程序的基础,不错
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-24 11:32 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表