本文目錄一覽:
- 1、>a是什麼意思’ title=’java中b>>a是什麼意思’>java中b>>a是什麼意思
- 2、>1」和「-1>>>1」有何差別?’ title=’java移位運算問題:「-1>>1」和「-1>>>1」有何差別?’>java移位運算問題:「-1>>1」和「-1>>>1」有何差別?
- 3、>運算符,看代碼。’ title=’Java 移位>>運算符,看代碼。’>Java 移位>>運算符,看代碼。
- 4、java中位移操作和乘法的區別
- 5、java 移位運算
- 6、java如何用移位符將一個數字加32?
>a是什麼意思’>java中b>>a是什麼意思
將b的值右移a位。
是java中的移位運算符,是右移位,因為數據存儲是二進制的所以左移1相當於乘以2的1次方,右移相當於乘以2的-1次方。
例如:右移運算符,num1,相當於num除以2,num2,相當於num除以2再除以2。
>1」和「-1>>>1」有何差別?’>java移位運算問題:「-1>>1」和「-1>>>1」有何差別?
這個是帶符號右移
這個是無符號右移
-1的二進制反碼錶示為 11111111 11111111 11111111 11111111
-11的結果是 : 1111111 1111111 11111111 1111111
-11的結果是: 01111111 11111111 1111111 11111111
無符號右移後前面補0,而帶符號右移是補符號位,也就 是第一位,負數補1,正數補0
Java的優點:
java是純面向對象編程的語言;
平台無關性 (一次編譯,到處運行;Write Once,Run Anywhere);
java提供了許多內置的類庫,通過這些類庫,簡化了開發人員的設計工作,同時縮短了項目開發時間;
提供了對Web應用開發的支持,例如,Applet,Servlet,和JSP可以用來開發Web應用程序,Socket,RMI可以用來開發分佈式應用程序的類庫。
>運算符,看代碼。’>Java 移位>>運算符,看代碼。
-4的二進制表示為1111 1111 1111 1011
i3 右移3位,移出的不管,左端補1 變為1111 1111 1111 1111 這是-1的二進制表示,所以結果為-1.
i5 同理。
具體原理:
先來說一下怎麼得出負數的二進制。原碼,反碼,補碼,這三個概念搞清。
1、原碼:一個正數,按照絕對值大小轉換成的二進制數;一個負數按照絕對值大小轉換成的二進制數,然後最高位補1,稱為原碼。
比如 00000000 00000000 00000000 00000101 是 5的 原碼。
10000000 00000000 00000000 00000101 是 -5的 原碼。
備註:
比如byte類型,用2^8來表示無符號整數的話,是0 – 255了;如果有符號, 最高位表示符號,0為正,1為負,那麼,正常的理解就是 -127 至 +127 了.這就是原碼了,值得一提的是,原碼的弱點,有2個0,即+0和-0(10000000和00000000);還有就是,進行異號相加或同號相減時,比較笨蛋,先要判斷2個數的絕對值大小,然後進行加減操作,最後運算結果的符號還要與大的符號相同;於是,反碼產生了。
2、反碼:正數的反碼與原碼相同,負數的反碼為對該數的原碼除符號位外各位取反[每一位取反(除符號位)]。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:正數00000000 00000000 00000000 00000101 的反碼還是 00000000 00000000 00000000 00000101
負數10000000 00000000 00000000 00000101 的反碼則是 11111111 11111111 11111111 11111010。
反碼是相互的,所以也可稱:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互為反碼。
備註:還是有+0和-0,沒過多久,反碼就成為了過濾產物,也就是,後來補碼出現了。
3、補碼:正數的補碼與原碼相同,負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1.
比如:10000000 00000000 00000000 00000101 的補碼是:11111111 11111111 11111111 11111010。
那麼,補碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
備註:1、從補碼求原碼的方法跟原碼求補碼是一樣的 ,也可以通過完全逆運算來做,先減一,再取反。
2、補碼卻規定0沒有正負之分
所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進制:0xFFFFFFFB。
搞懂二進制表示後,再來說一下左移右移運算符。
左移運算是將一個二進制位的操作數按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。右移運算是將一個二進制位的操作數按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。(均由機器來定)
So,為什麼得到-1知道了吧~~~
java中位移操作和乘法的區別
ava中有三種移位運算符
: 左移運算符,num 1,相當於num乘以2
: 右移運算符,num 1,相當於num除以2
: 無符號右移,忽略符號位,空位都以0補齊
對於:
無符號右移,忽略符號位,空位都以0補齊
value num — num 指定要移位值value 移動的位數。
無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位 無符號右移運算符 只是對32位和64位的值有意義
java 移位運算
「系統先用b對32求余」 看這句了嗎。
int 一共32位,移32時,已經全部是0。
你希望只移32位,b就不要多於32。開始移位之前做一下判斷。
java如何用移位符將一個數字加32?
只通過位移符無法得到結果,因為位移符向左每位移一位相當於乘以2,向左位移5位相當於乘以2×2×2×2×2=32,所以十進制數字1向左位移5為可以得到1×32=32。其本質是十進制數的1轉換為二進制數後為0000 0001,其向左位移5位後為0010 0000,轉換為十進制數就是32。
位移相當於乘法,所以我們無法只通過位移符使一個數加32,那麼就這樣吧:
運行結果:
1 5 = 32,所以1 + 1 5 = 33, 2 + 1 5 = 34, 3 + 1 5 = 35。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/237487.html