C位運算分析及進制轉換
作為C初學者,曾經的我在這個位運算和二進制的轉換中始終搞不懂怎麼去準換,怎麼去搞懂。這裡把我掌握的方法給大家分享下
- 二進制轉換
- 位運算符
- 總結
二進制轉換
- 二進制轉八進制
二進制轉換成八進制簡易的辦法,我們隻需要記住0~7的二進制。對二進制從右向左計算。每隔3位計算
2進制 | 8進制 |
---|---|
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
對二進制從右向左,每3位進行截斷
100010100101
100 010 100 101 前面不足三位補充0
這樣我們就可以快速的進行計算了,上面這個結果得出來是:4245
八進制轉換成二進制也一樣的啦,倒推算就行了
to example:
() ====> ()
() ====> ()
- 二進制轉十進制
二進制轉換同八進制、十六進制的方法不同,不能用它們的方法來進行轉換
二進制轉換成十進制
1000101(2) ==> 1+2^6+1*2^2+1*2^0=64 + 4 + 1 = 69(10)
同理八進制或者16進制以及其他進制都可以按照這樣的方式去計算,隻不過相對于這種方式,八進制和十六進制沒有一下說的方法簡便
十進制轉二進制
采用除2取餘,逆序排法
10 to 2 example:
56/2=28 == >0
28/2=14 == >0
14/2=7 == >0
7/2=3 ==> 1
3/2=1 ⇒ 1
1/2=0 ==>1
逆序排法:111000
-
二進制轉十六進制
其實二進制轉換成十六進制道理也是一樣的,差別在于二進制轉十六進制是按照每4位從向左截斷
2進制 | 16進制 |
---|---|
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
這裡我們拆分一個看下:
1000 1010 0101
拆分過後我們就很容易得出這個十六進制:9A6
2 to 16 example:
1010 1010 1010(16) ==> AAA(2)
C5D2(16) ⇒ 1100 0101 1101 0010(16)
位運算
位運算,就是對一個比特(Bit)位進行操作。
c語言有六中位運算符
運算符 | 說明 |
---|---|
& | 按位與 |
| | 按位或 |
^ | 按位異或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
按位與運算(&)
一個比特位隻有0或者1兩個取值,隻有參與&(位與)運算的兩個位都為1時,結果才為1,否則為0。例如1&1為1,0&0為0,1&0為0
數值在記憶體中是以二進制的形式中存在,7&8 可寫算式如下:
0000 0111 7
&0000 1001 8
0000 0001 = 1
按位或運算(|)
參與或運算|的兩個二進制位有一個為1時,結果就為1,兩個都為0時結果才為0。例如1|1為1,0|0為0,1|0為1。
9|5可寫算式如下:
00001001 (9的二進制)
|00000101 (5的二進制)
00001101 (13的二進制)
是以9|5=13。
按位或運算可以用來将某些二進制位置1,而保留某些位
按位異或運算(^)
按位異或運算
參與異或運算^的兩個二進制位不同時,結果為1,相同時結果為0。也就是說,0^1為1,0^0為0,1^1為0。
9^5可寫成算式如下:
00001001 (9的二進制)
^00000101 (5的二進制)
00001100 (12的二進制)
是以9^5=12。
按位異或運算可以用來反轉某些二進制位
取反(~)
取反運算符~為單目運算符,右結合性,作用是對參與運算的數的各二進位按位取反。例如 ~1為0,~0為1。
~9的運算為:
~0000000000001001
1111111111110110
是以~9=65526。
位左移(<<)
左移運算符<<用來把操作數的各二進位全部左移若幹位,高位丢棄,低位補0。例如:
a=9;
a<<3;
<<左邊是要移位的操作數,右邊是要移動的位數。
上面的代碼表示把a的各二進位向左移動3位。a=00001001(9的二進制),左移3位後為01001000(十進制72)。
位右移(>>)
右移運算符>>用來把操作數的各二進位全部右移若幹位,低位丢棄,高位補0(或1)。例如:
a=9;
a>>3;
表示把a的各二進位向右移動3位。a=00001001(9的二進制),右移3位後為00000001(十進制1)。
需要注意的是,對于有符号數,在右移時,符号位将随同移動。當為正數時,最高位補0,而為負數時,符号位為1,最高位是補0或是補1 取決于編譯器的規定。