小古銀的官方**(完整教程):
減法二進位制的乘法和除法
左移運算和右移運算
與運算或運算
異或運算
取反運算
運算子在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位被捨棄,結果就是1100
;0110
左移兩位就是在右邊新增2位0,得出011000
,由於固定位數,所以左邊超出的2位被捨棄,結果就是1000
,以此類推。右移也是同理,0110
右移1位就是0011
,右移2位就是0001
。
在c++中左移的運算符號是<<
,右移的運算符號是>>
。0110
左移2位的**就是0110 << 2
,0110
右移2位的**就是0110 >> 2
。
乙個有意思的規律:例如0001 + 0001
的結果是0010
,0010 + 0010
的結果是0100
,0011 + 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...