天天看點

C位運算分析及進制轉換C位運算分析及進制轉換

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 取決于編譯器的規定。