1. 程式人生 > >位運算

位運算

真值表 如果 嵌入 右移 左移 進制 邏輯或 位移 xe8

1.位與運算 &
註意:& 和 && 是有區別的。前面這個是位與運算,後者是邏輯與運算,也就是算數運算

1 1 1 1
0 1 0 1
看看位與運算的真值表 結論:全真為真。其他為假
0 & 1 0
1 & 0 0
1 & 1 1
0 & 0 0

0x5b 5 0101

例如:
0xb5 & 0123 0x11
001101110
010101111
00000101110 02e

0x2c & 0x2b 0x28
1100
1010 1000

2.位或運算
真值表
0 | 0 0

0 | 1 1

1 | 0 1

1 | 1 1

位或運算 (|)和邏輯或(||)區別

區別和上面的與類似 有1就為1

027 | 0x74
00010111
01110101

0111 0111 0x77

0x1f | 0xa5 0xbf

0x5f | 0x50 0x5f

3、位異或 (^)

真值表;
1 ^ 0 1
1 ^ 1 0
0 ^ 0 0
0 ^ 1 1

從真值表能得出結論:相同的就為0,不同的為1

異或就是相當於把兩個相異的進行或操作

25 ^ 0263

0x5f ^ 0xa4 0xfb
01011111
10100100 1111 1011 0xfb

0x47 & 0x38 0xa5 | 0x4f 0x14 ^ 0124

0x0 0xef 0x40 0x004 0xa8

000010100
001010100
0100 0000

4、位取反 ~
註意:在C語言中位取反是~,邏輯取反!
規則:把二進制數進行一個變化。1變成0,0變成1

總結:任何非0的數被邏輯取反在取反就會得到1;
任何非0數被位取反在取反就會得到本身;

~0x5f ~0124 ~47
0xa0 065 0x2b

總結:

5.左移動 << 右移動 >>
在c語言中,進行位左移操作的時候要取決於數據類型
對於無符號數,左移時右側補0
對於無符號數,右移動左側補0;
對於有符號數, 左移動時右側補0
對於有符號數,右移時左側補符號位(如果是正數九補0,負數補1);

在嵌入式中。在研究位移動,為了方便、快捷。我們規定移位都是無符號的數。

6.左移 <<

s數<< 多少位

0x54 <<2
01010100 01010000 0x50

0xf4 <<1 0x6b<<6
0xe8 0xc0

7.右移

數>> 多少位

0x54 >>2

01010100


0xf4 >>4 0xd1 >>1
0x0f 0x68

升級:

0x17 的第2位變成0
00010111 結果:00010011 0x13
&
11111011 取反:00000100 把1進行變化00000001 ~(1<<2) & 0x17


00011011 0x1b 請把第2位變成1;00011111

00011011
00000100 或運算 00011111
00000100 和00000001 (1<<2) | 0x1b 00011111

位運算