亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java基礎(chǔ)之位運(yùn)算知識總結(jié)

 更新時間:2021年05月17日 15:44:27   作者:董一刀  
最近接觸到了java位運(yùn)算,之前對位運(yùn)算的了解僅僅停留在表現(xiàn)結(jié)果上,乘2除以2,對背后的原理并不了解,現(xiàn)在學(xué)習(xí)記錄一下,需要的朋友可以參考下

一、位運(yùn)算的分類與展現(xiàn)效果

java位運(yùn)算可以分為左移和右移,其中右移還有無符號右移。

image-20210516164550531

java只對整型位移,可以分為int體系和long體系。int體系包括(byte, short, int, char),long體系只包含long。int體系中進(jìn)行位運(yùn)算時,除int類型外都會先轉(zhuǎn)換為int再進(jìn)行運(yùn)算。.
無符號右移指的是,向右移動時,左邊補(bǔ)位的是0。
一般來說,右移左移常用作乘2n 或者除以2n。(右移除以2n,左移乘以2n)

int i1 = 4; 
int r1 = i1 >> 2; // 除以2^2
int r2 = i1 << 2; // 乘以2^2
System.out.println(r1); // 1
System.out.println(r2); // 16

二、原理

位運(yùn)算實(shí)際上是將數(shù)值對應(yīng)的二進(jìn)制進(jìn)行左右位移操作。java中數(shù)值的存儲、運(yùn)算是以補(bǔ)碼的形式進(jìn)行的。數(shù)值有三種存儲方式:原碼、反碼、補(bǔ)碼。

原碼的最高位為符號位(0為正數(shù),1為負(fù)數(shù)),其余位用于存儲數(shù)值,以8位整型為例,2對應(yīng):

0000 0010

-2對應(yīng):

1000 0010

  反碼和補(bǔ)碼的正數(shù)都與原碼相同。反碼的負(fù)數(shù)在原碼的基礎(chǔ)上進(jìn)行,除符號位外,其余按位取反。例如2的反碼為:

0000 0010(正數(shù)不變)

-2的反碼為:

1111 1101

補(bǔ)碼在反碼的基礎(chǔ)上進(jìn)行,反碼加1就變成補(bǔ)碼。

2:

0000 0010(正數(shù)不變)

-2為:

1111 1110

8位整型,反碼可以表示的范圍為:[-128,127]

-128的反碼表示為:

1000 0000

可以理解為:

1 1000 0000(原) => 1 0111 1111(反) => 1 1000 0000(補(bǔ)) => 1000 0000(補(bǔ))

(查看了一些解釋,-128的補(bǔ)碼規(guī)定為1000 0000,若不理解,可以先跳過。)

左移即是補(bǔ)碼向左移動,右邊空出的用0補(bǔ)位,右移就是向右動,左邊空出來的以符號位補(bǔ)位。(無符號右移,左邊空出來的以0補(bǔ)位)。下面以具體代碼舉例(int 為32位):

正數(shù):

int i1 = 4; // 0000 0000 0000 0000 0000 0000 0000 0100
int r1 = i1 >> 2; // 期望 0000 0000 0000 0000 0000 0000 0000 0001 = 1
int r2 = i1 << 2; // 期望 0000 0000 0000 0000 0000 0000 0001 0000 = 16
System.out.println(r1); // 實(shí)際:1
System.out.println(r2); // 實(shí)際:16

負(fù)數(shù):

int i2 = -4; // 1111 1111 1111 1111 _ 1111 1111 1111 1100
int r3 = i2 >> 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 1111 = -1
int r4 = i2 << 2; // 期望:1111 1111 1111 1111 _ 1111 1111 1111 0000 = -16
int rx = i2 >>> 1; // 期望: 0111 1111 1111 1111 _ 1111 1111 1111 1110 = 2147483646
System.out.println(rx); // 實(shí)際:2147483646
System.out.println(r3); // 實(shí)際:-1
System.out.println(r4); // 實(shí)際:-16

rx記錄無符號右移結(jié)果,移動后左邊補(bǔ)位以0補(bǔ)滿,于是結(jié)果就變成了2147483646

三、邊界值測試

int類型的范圍為[-2147483648, 2147483647],下面對上下界分別進(jìn)行測試:

// 邊界值測試:
int imax = Integer.MAX_VALUE; // 21_4748_3647 = 0111_1111_1111_1111_1111_1111_1111_1111 (2^31-1)

int r5  = imax >> 2; // 0001_1111_1111_1111_1111_1111_1111_1111 = (2^30 - 1) = 5_3687_0911

System.out.println(r5);// 實(shí)際:5_3687_0911

int r6 = max << 2; // 1111_1111_1111_1111_1111_1111_1111_1100 (補(bǔ)碼形式 ) = -4

System.out.println(r6);// 實(shí)際:-4

int imin = Integer.MIN_VALUE; //-21_4748_3648=1000_0000_0000_0000_0000_0000_0000_0000

int r7 = imin << 1; // 0000_0000_0000_0000_0000_0000_0000_0000 = 0

System.out.println(r7); // 實(shí)際:0

根據(jù)位運(yùn)算原理,在邊界測試的結(jié)果并不一定是乘以2n或者除以2n。對邊界值進(jìn)行位運(yùn)算時,需要注意。

到此這篇關(guān)于Java基礎(chǔ)之位運(yùn)算知識總結(jié)的文章就介紹到這了,更多相關(guān)Java位運(yùn)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java面試最容易被刷的重難點(diǎn)之鎖的使用策略

    Java面試最容易被刷的重難點(diǎn)之鎖的使用策略

    鎖像synchronized同步塊一樣,是一種線程同步機(jī)制,但比Java中的synchronized同步塊更復(fù)雜。因?yàn)殒i(以及其它更高級的線程同步機(jī)制)是由synchronized同步塊的方式實(shí)現(xiàn)的,所以我們還不能完全擺脫synchronized關(guān)鍵字
    2021-10-10
  • Java服務(wù)器宕機(jī)的解決方法論

    Java服務(wù)器宕機(jī)的解決方法論

    這篇文章主要介紹了Java服務(wù)器宕機(jī)的解決方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 初學(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)

    初學(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)

    下面小編就為大家?guī)硪黄鯇W(xué)者易上手的SSH-struts2 01環(huán)境搭建(圖文教程)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Java?ynchronized重量級鎖的核心原理詳解

    Java?ynchronized重量級鎖的核心原理詳解

    這篇文章主要為大家詳細(xì)介紹了Java?ynchronized重量級鎖的核心原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳細(xì)談?wù)凧ava中l(wèi)ong和double的原子性

    詳細(xì)談?wù)凧ava中l(wèi)ong和double的原子性

    原子性是指一個操作或多個操作要么全部執(zhí)行,且執(zhí)行的過程不會被任何因素打斷,要么就都不執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ong和double原子性的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 最新springboot中必須要了解的自動裝配原理

    最新springboot中必須要了解的自動裝配原理

    本文給大家介紹springboot中必須要了解的自動裝配原理,spring-boot-dependencies:核心依賴都在父工程中,這個里面主要是管理項(xiàng)目的資源過濾及插件,本文對springboot自動裝配原理給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-05-05
  • Springboot如何使用@Async實(shí)現(xiàn)異步任務(wù)

    Springboot如何使用@Async實(shí)現(xiàn)異步任務(wù)

    這篇文章主要介紹了Springboot如何使用@Async實(shí)現(xiàn)異步任務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java多線程下的單例模式參考

    Java多線程下的單例模式參考

    這篇文章主要演示多線程下的單例模式,分別演示了lock和synchronized兩種方案,希望能給大家做一個參考。
    2016-06-06
  • javaweb實(shí)現(xiàn)文件上傳示例代碼

    javaweb實(shí)現(xiàn)文件上傳示例代碼

    這篇文章主要為大家詳細(xì)介紹了javaweb實(shí)現(xiàn)文件上傳的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論