標籤:計算 機器 sdn 可見 char 如何 32位 依次 for
<1>.在瞭解位移之前,先瞭解一下正數和負數的二進位表示形式以及關係:
舉例15和-15:
15 的原碼: 00000000 00000000 00000000 00001111
補碼: 11111111 11111111 11111111 11110000
+1 =
-15的原碼:11111111 11111111 11111111 11110001
負數的原碼即為:正數的原碼取反,再加1。
<2>位移操作:(只針對 int類型的資料有效,java中,一個int的長度始終是32位,也就是4個位元組,它操作的都是該整數的位元).也可以作用於以下類型,即 byte,short,char,long(當然,它們都是整數形式)。當為這四種類型是,JVM先把它們轉換成int型再進行操作。
<< 左移
>> 右移
>>> 無符號右移
<< 和>>為數值位移,>>>為邏輯位移。【注】:Java中不存在<<<。
$1> m<<n的含義:把整數m表示的位元左移n位,高位移出n位都捨棄,低位補0. (此時將會出現正數變成負數的形式)
執行個體:
3<<2剖析:
3二進位形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即為12.
左移使整數變為負數:
10737418<<8
10737418二進位表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即為:-1546188288.
$2> m>>n的含義:把整數m表示的位元右移n位,m為正數,高位全部補0;m為負數,高位全部補1.
實 例:
3>>2剖析:
3二進位形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即為0.
-3>>2剖析:
-3二進位形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即為-1.
以上:每 個整數表示的二進位都是32位的,如果右移32位和右移0位的效果是一樣的。依次類推,右移32的倍數位都一樣。
備忘:對於右移32位與右移0位是結果是一樣的,我一直不能夠理解。現在我只能理解為32比較特殊。相當於整體全移。與移0位相同。左移也是一樣的。
$3> m>>>n:整數m表示的二進位右移n位,不論正負數,高位都補零。
執行個體:
3>>>2剖析:
3二進位形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即為0.
-3>>>2剖析:
-3二進位形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即為1073741823.
【注】:對於$1,$2,$3,如果n為負數:這時JVM會先讓n對32模數,變成一個絕對值小於32的負數,然後再加上32,直到 n 變成一個正數。
執行個體:
4<<-10
4的二進位形式:00000000 00000000 00000000 00000100,-10對32模數再加上32,不用說了,得到22,則4<<-10,即相當於4<<22。
此時按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即為:16777216。
OK, 大功告成。
綜上所述:
m<<n即在數字沒有溢出的前提下,對於正數和負數,左移n位都相當於m乘以2的n次方.
m>>n即相當於m除以2的n次方,得到的為整數時,即為結果。如果結果為小數,此時會出現兩種情況:(1)如果m為正數,得到的商會無條件 的捨棄小數位;(2)如果m為負數,捨棄小數部分,然後把整數部分加+1得到位移後的值。
---------------------------------------------------------------------------------
接 下來在此說說位操作的好處,速度超快,這些都是底層的二進位機器操作指令。
比如:a*2,
1.jvm先為變數a分配空間;
2.再進行a*2的操作;
3.再把結果返回給相應的變數。
而 a<<1,和a*2一樣,它只需要一條指令即可,速度很快。當然前三種位移操作都是對2的倍數
進行操作時可用。
再 進行些許補充,談到位操作,當然還要說到四個操作符:~(按位非),|(按位或),&(按位
與),^(按位異或),這些都是大學 電腦基礎用法,對整數的二進位形式進行操作,然後再
轉換為整數,具體操作如下。
1.~(按位非):【解義】對該整數的二進位形 式逐位取反。
~4:(一元操作符)
4的二進位形式為:00000000 00000000 00000000 00000100,逐位取反後得
到:11111111 11111111 11111111 11111011,即為-5.
2.| (按位或):【解義】對兩個整數的二進位形式逐位進行邏輯或運算,原理為:1|0=1,0|0=0,1|1=1,0|1=1
等。
4|-5:
4的二進位形式為:00000000 00000000 00000000 00000100,
-5的二進位形式為:11111111 11111111 11111111 11111011,
逐位進行邏輯或運算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位與):【解義】對兩個整數的二進位形式逐位進行邏輯與 運算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。
4&-5:
4的二進位形式為:00000000 00000000 00000000 00000100,
-5的二進位形式為:11111111 11111111 11111111 11111011,
逐位進行邏輯與運算:00000000 00000000 00000000 00000000,即得到0.
實際應用:可以把位元組轉換為整 數,-64&0xFF=192,也可以用八進位的形式,-64&0377=192、
其實0xFF和0377都表示的是整數255、
4.^(按 位異或):【解義】對兩個整數的二進位形式逐位進行邏輯異或運算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
4^-5:
4的二進位形式為:00000000 00000000 00000000 00000100,
-5的二進位形式為:11111111 11111111 11111111 11111011,
逐位進行邏輯異或運算:11111111 11111111 11111111 11111111,即得到-1.
實際應用:按位異或可以比較兩個數字是否相等,它利用 1^1=0,0^0=0的原理。 20^20==0
轉自:http://aokunsang.javaeye.com/blog/615658
關於二進位一些說明:
關於負數的二進位表示方法
今天知道了對於負數的二進位方法的表示方法:例如 -5
第一步:首先要把5變成101的二進位形式
第二步:再者就是按位取反,(形 成前面全是1)010
第三步:在最後加1 形成:11111111 11111111 11111111 11111011
反過來如果把 最高位是1的二進位變成負的整形時
第一步:位取反,變成00000000 00000000 00000000 00000100
第二 步:在最低位加上1,形成101
第三步:形成整形5 ,在加上負號;
在java中怎麼用代碼實現二進位於十進位的轉化
public int binaryInToInt(String str)
{
int j=0,i=0;
char c;
for(i=0;i<str.length();i++)
{
if(str.charAt(str.length()-i)==‘1‘)
{
j=j+exp(2*ln(str.length()-i));
}
}
return j;
}
轉自:
http://blog.csdn.net/zdp5528/archive/2008/04/10/2278719.aspx
(1)正負表示方法
用位元組的最高位表示:"1"表示"正","0"表示"負"
(2)電腦中數字是以哪個碼儲存的?
補碼
(3) 負數 的二進位補碼轉換成十進位的方法
1、把補碼“取反”(把位元的各位“1”換“0”,“0”換“1”。比如“101010”取反後為“010101”)
2、把取反後的位元“加1”
3、最後用常規的方法把“加1”後的位元轉換為十進位數
將負數轉換為二進位
http://blog.csdn.net/onewalkingman/archive/2009/01/10/3746154.aspx
我們已經知道電腦中,所有資料最終都是使用位元表達。
我們也已經學會如何將一個10進位數如何轉換為位元。
不過,我們仍然沒有學習一個負數如何用二進位表達。
比如,假設有一 int 類型的數,值為5,那麼,我們知道它在電腦中表示為:
00000000 00000000 00000000 00000101
5轉換成二制是101,不過int類型的數佔用4位元組(32位),所以前面填了一堆0。
現在想知道,-5在電腦中如何表示?
在電腦中,負數以其正值的補碼形式表達。
什麼叫補碼呢?這得從原碼,反碼說起。
原碼:一個整數,按照絕對值大小轉換成的位元,稱為原碼。
比如 00000000 00000000 00000000 00000101 是 5的 原碼。
反碼:將位元按位取反,所得的新位元稱為原位元的反碼。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。
反碼是相互的,所以也可稱:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。
補碼:反碼加1稱為補碼。
也就是說,要得到一個數的補碼,先得到反碼,然後將反碼加上1,所得數稱為補碼。
比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
那麼,補碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在電腦中表達為:11111111 11111111 11111111 11111011。轉換為十六進位:0xFFFFFFFB。
再舉一例,我們來看整數-1在電腦中如何表示。
假設這也是一個int類型,那麼:
1、先取1的原碼:00000000 00000000 00000000 0000000111111111 11111111 11111111 11111110
2、得反碼: 11111111 11111111 11111111 11111110
3、得補碼: 11111111 11111111 11111111 11111111
可見,-1在電腦裡用二進位表達就是全1。16進位為:0xFFFFFF
個人總結:
補碼:反碼加1稱為補碼。
一個負二進位轉為十進位
例如:11111111 11111111 11111111 11111110
第一步:減1 變為11111111 11111111 11111111 11111101(二進位,第一位不足時從第二位第一也為2)
第二步:取反 00000000 00000000 00000000 00000010
根據常用方法轉為十進位.最後要加-號
關於java中的~按位非
如:~1
1二進位為 00000000 00000000 00000000 00000001
~1為: 11111111 11111111 11111111 11111110
首位為1說明此數為-根據上面的計算方法,即可以計算出結果。
關於java按位操作運算