在現代計算機中所有的資料都是以二進位制的形式儲存在裝置中。即0、1兩種狀態,計算機對二進位制資料進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。
加法和乘法
舉乙個簡單的例子來看下cpu是如何進行計算的,比如這行**
int a = 35;
int b = 47;
int c = a + b;
計算兩個數的和,因為在計算機中都是以二進位制來進行運算,所以上面我們所給的int變數會在機器內部先轉換為二進位制在進行相加
35: 0 0 1 0 0 0 1 1
47: 0 0 1 0 1 1 1 1
————————————————————
82: 0 1 0 1 0 0 1 0
再來看下乘法,執行如下的**
int a = 3;
int b = 2;
int c = a * b;
3: 0 0 0 0 0 0 1 1 * 2
————————————————————
6: 0 0 0 0 0 1 1 0
*********************************************
int a = 3;
int b = 4;
int c = a * b;
3: 0 0 0 0 0 0 1 1 * 4
————————————————————
12: 0 0 0 0 1 1 0 0
*********************************************
int a = 3;
int b = 8;
int c = a * b;
3: 0 0 0 0 0 0 1 1 * 8
————————————————————
24: 0 0 0 1 1 0 0 0
通過以上運算可以看出當用a乘b,且如果b滿足2^n的時候 就相當於把a的二進位制資料向左移動n位,放到**中 我們可以這樣來寫a << n,所以上面3 * 2、3 * 4、3 * 8其實是可以寫成3<<1、3<<2、3<<3,運算結果都是一樣的。
那假如相乘的兩個數都不滿足2n怎麼辦呢?其實這個時候編譯器會將其中乙個數拆分成多個滿足2n的數相加的情況,打個比方
int a = 15; int a = 15
int b = 13; => int b = (4 + 8 + 1)
int c = a * b; int c = a * b
最後其實執行相乘運算就會變成這樣15 * 4 + 15 * 8 + 15 * 1,按照上文說的移位來轉換為位運算就會變成15 << 2 + 15 << 3 + 15 << 0
減法和除法
減法也是與加法同理只不過計算機內減法操作就是加上乙個數的負數形式,且在作業系統中都是以補碼的形式進行操作(因為正數的原始碼補碼反碼都與本身相同)。首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據符號位, 選擇對真值區域的加減. 但是對於計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單. 計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.
除法的話其實和乘法原理相同,不過乘法是左移而除法是右移,但是除法的計算量要比乘法大得多,其大部分的消耗都在拆分數值,和處理小數的步驟上,所以如果我們在進行生成變數的時候如果遇到多位的小數我們盡量把他換成string的形式,這也是為什麼浮點運算會消耗大量的時鐘週期(作業系統中每進行乙個移位或者加法運算的過程所消耗的時間就是乙個時鐘週期,3.0ghz頻率的cpu可以在一秒執行運算3.010241024*1024個時鐘週期)
使用的運算子包括下面:
含義運算子
例子左移
<<
0011 => 0110
右移》0110 => 0011
按位或︳
0011
------- => 1011
1011
按位與&
0011
------- => 0011
1011
按位取反
~0011 => 1100
按位異或 (相同為零不同為一)
^0011
------- => 1000
1011
位運算(1) 初識位運算
前段時間數電課學了些進製轉換,還有與或非等邏輯運算,如今再來看看位運算,倒輕鬆了不少。很早就想寫些非總結性部落格了,奈何還是太懶。也也不知怎的突然又來了興致,趕忙寫下這篇部落格。廢話不多說,今天準備總結總結關於位運算的知識。程式中的所有數在計算機記憶體中都是以二進位制的形式儲存的,即0 1兩種狀態,...
位運算子和位運算
一 按位與 運算子 1 運算規則 參加運算的兩個 資料,按二進位進行 與 運算,如果兩個相應的二進位都為1,則該位的結果值為1,否則為0,即 0 0 0,0 1 0,1 0 0,1 1 1.2 用途 1 清零 運算物件 原來的數中為1的位,新數中相應位為0。2 取乙個數中某些指定位。如想要取乙個整數...
位運算子與位運算
位運算是對二進位制位的操作,它應用於整形資料,把整形資料看成固定的二進位制序列,然後對二進位制序列進行位運算 按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例c a b a 1010...