C 入門教程(十六) 二進位制的運算

2021-08-18 00:13:30 字數 4919 閱讀 3220

小古銀的官方**(完整教程):

減法二進位制的乘法和除法

左移運算和右移運算

與運算或運算

異或運算

取反運算

運算子在c++**中的簡化:

儲存過大資料時注意範圍

010 + 010為例子:加號兩邊的數值的右邊第一位都是0,相加得0;中間那一位都是1,相加得2,所以需要進製,結果變為0;左邊第一位都是0,相加得0,再加上進的位,所以結果是1。那麼最後結果就是100。也就是十進位制的2 + 2的結果是4

注意:而c++中的二進位制的運算都是有乙個前提條件,就是必須固定位數再進行運算,如果進製時超出位數那麼超出部分將會被捨棄。例如要相加的二進位制數值是3位數,110 + 010,按照加法運算結果應該是1000,因為位數已經固定三位,左邊超出的一位將被捨棄,所以結果是000

提示:二進位制表示數值時,左邊的0是可以省略的,把左邊的0寫出來是為了方便講解,如二進位制的00000010可以省略寫成二進位制的10,相當於十進位制的00123456也可以簡寫成123456。由於c++的二進位制運算是固定位數的,所以就算你省略了左邊的0,程式也是知道左邊應該補上多少個0。

#include int main(void)

輸出結果:

0b010 + 0b010 = 4

0

二進位制的010加上二進位制的010結果是二進位制的100,也就是十進位制2加上十進位制2等於十進位制的4

unsigned int是儲存非負整數的int型別,它的最大值是4294967295,也就是二進位制32位都是1的值,而且unsigned int是用固定的32位二進位制來儲存資料的,所以當它加上1的時候,就會因為進製而超出乙個位,而超出的這個位就會被捨棄,因此輸出結果就是0

101 - 011為例子:第一位相減結果是0,而第二位0減去1需要向高位借一位,因此第二位結果是1,但三位結果是0,則結果是010。也就是十進位制的5 - 3結果是2

注意:由於運算需要固定位數,所以上面內容同樣也適用於減法運算,但是需要注意的是二進位制只有0和1而沒有正負的概念。以010 - 011作為例子:第一位結果是1,而且向第二位借了一位;而第二位此時已經不能正常運算了,此時雖然沒有第四位,但是它可以從第四位借一位,第四位向誰借就不管了,反正第三位可以計算了,那麼第二位就可以向第三位借一位,第二位結果是1,第三位結果是1。最後結果就是二進位制的111

#include int main(void)

輸出結果:

0b101 - 0b010 = 2

4294967295

二進位制的101減去二進位制的011結果是二進位制的010,也就是十進位制的5減去3等於的2

由於固定了32位的二進位制運算,按照上面的運算方法得出的結果是二進位制的32位都是1,也就是unsigned int的最大值,所以對應的十進位制結果就是4294967295

二進位制的乘法和除法比較複雜,而且對c++基礎知識幫助不大,就不講解了。以下講解的運算是二進位制特有的運算。

以二進位制0110舉例:0110左移一位就是在右邊新增1位0,得出01100,由於固定位數,所以左邊超出的1位被捨棄,結果就是11000110左移兩位就是在右邊新增2位0,得出011000,由於固定位數,所以左邊超出的2位被捨棄,結果就是1000,以此類推。右移也是同理,0110右移1位就是0011,右移2位就是0001

在c++中左移的運算符號是<<,右移的運算符號是>>0110左移2位的**就是0110 << 20110右移2位的**就是0110 >> 2

乙個有意思的規律:例如0001 + 0001的結果是00100010 + 0010的結果是01000011 + 0011的結果是0110。可以看出:乙個數乘以2就等於這個數左移一位,而乙個數左移兩位就是這個數乘以2的2次方,以此類推。而右移也是同理。

特殊的情況,2的10次方就是1左移10位,結果就是二進位制的10000000000,也就是十進位制的1024

#include int main(void)

輸出結果:

8005

0

十進位制的10左移3位,也就是十進位制的10乘以2的3次方,結果就是十進位制的80。

變數value1儲存的數左移一位,由於unsigned int型別用32位二進位制來儲存資料,所以當它左移一位時,左邊的1因為超出而被捨棄,結果就是0。

十進位制的10右移1位,也就是十進位制的10除以2的1次方,結果就是十進位制的5。

變數value2儲存的數右移一位,由於unsigned int型別用32位二進位制來儲存資料,所以當它右移一位時,右邊的1因為超出而被捨棄,結果就是0。

在c++中,與運算的運算符號是&

1 & 1的結果是1;1 & 0或者0 & 1的結果是0,0 & 0的結果也是0。

而二進位制運算0110 & 0100的結果是0100。可以看出與運算就是二進位制各個位上對應的數進行與運算,都是1的時候結果是1,有乙個0或者都是0的時候結果是0。

在c++中,或運算的運算符號是|

1 | 1的結果是1;1 | 0或者0 | 1的結果是1,0 | 0的結果也是0。

而二進位制運算0110 | 0100的結果是0110。可以看出或運算就是二進位制各個位上對應的數進行或運算,都是1或者有乙個是1的時候結果是1,都是0的時候結果是0。

在c++中,異或運算的運算符號是^

1 ^ 1的結果是0;1 ^ 0或者0 ^ 1的結果是1,0 ^ 0的結果也是0。也就是說,異或相同的數結果是0,異或不同的數結果是1,而二進位制運算0110 ^ 0100的結果是0010

在c++中,取反運算的運算符號是~。取反運算就是二進位制各個位上的數,0變為1,1變為0。例如二進位制運算~0110的結果是1001

注意:取反運算時,需要注意它的資料型別,不同的資料型別的位數都不相同,而上面也說過左邊多出來的0可以省略,所以就算是同乙個數,如0b1101,二進位制位數是4位時結果是0b0010,二進位制位數是8位時結果是0b11110010,它們的值是不一樣的。所以,取反必須要注意它的資料型別喲~。

#include int main(void)

輸出結果:

462

4294967295

二進位制0100就是十進位制的4,二進位制的0110就是十進位制的6,二進位制的0010就是十進位制2。二進位制32位上所有位都是0,取反就是二進位制32位上所有位都是1,也就是unsigned int型別的最大值4294967295

unsinged int用二進位制32位來儲存資料,如果用unsinged int的變數儲存更大的資料會怎麼樣呢?

#include int main(void)

輸出結果:

1
可以看出,用二進位制32位的空間儲存33位的資料,它只會儲存前32位資料,第33位資料會被捨棄。所以,用變數儲存資料時要注意不要儲存過大的數值。

C 二進位制,十進位制,十六進製制

c 技術 c 二進位制,十進位制,十六進製制 互轉 十進位制轉二進位制 console.writeline convert.tostring 69,2 十進位制轉八進位制 console.writeline convert.tostring 69,8 十進位制轉十六進製制 console.write...

C 二進位制,十進位制,十六進製制 互轉

十進位制轉二進位制 console.writeline convert.tostring 69,2 十進位制轉八進位制 console.writeline convert.tostring 69,8 十進位制轉十六進製制 console.writeline convert.tostring 69,1...

C 二進位制,十進位制,十六進製制 互轉

十進位制轉二進位制 console.writeline convert.tostring 69,2 十進位制轉八進位制 console.writeline convert.tostring 69,8 十進位制轉十六進製制 console.writeline convert.tostring 69,1...