位運算

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

三、位異或 (^)

真值表;
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

四、位取反 ~
注意:在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

0001101100000100  或運算  0001111100000100  和00000001   (1<<2) | 0x1b   00011111 

相關文章
相關標籤/搜索