最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

image-20210516164550531

java只對(duì)整型位移,可以分為int體系和long體系。int體系包括(byte, short, int, char),long體系只包含long。int體系中進(jìn)行位運(yùn)算時(shí),除int類型外都會(huì)先轉(zhuǎn)換為int再進(jìn)行運(yùn)算。.
無(wú)符號(hào)右移指的是,向右移動(dòng)時(shí),左邊補(bǔ)位的是0。
一般來(lái)說(shuō),右移左移常用作乘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ù)值對(duì)應(yīng)的二進(jìn)制進(jìn)行左右位移操作。java中數(shù)值的存儲(chǔ)、運(yùn)算是以補(bǔ)碼的形式進(jìn)行的。數(shù)值有三種存儲(chǔ)方式:原碼、反碼、補(bǔ)碼。

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

0000 0010

-2對(duì)應(yīng):

1000 0010

  反碼和補(bǔ)碼的正數(shù)都與原碼相同。反碼的負(fù)數(shù)在原碼的基礎(chǔ)上進(jìn)行,除符號(hào)位外,其余按位取反。例如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ǔ)碼向左移動(dòng),右邊空出的用0補(bǔ)位,右移就是向右動(dòng),左邊空出來(lái)的以符號(hào)位補(bǔ)位。(無(wú)符號(hào)右移,左邊空出來(lái)的以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記錄無(wú)符號(hào)右移結(jié)果,移動(dòng)后左邊補(bǔ)位以0補(bǔ)滿,于是結(jié)果就變成了2147483646

三、邊界值測(cè)試

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

// 邊界值測(cè)試:
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)算原理,在邊界測(cè)試的結(jié)果并不一定是乘以2n或者除以2n。對(duì)邊界值進(jìn)行位運(yùn)算時(shí),需要注意。

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

相關(guān)文章

  • Spring AOP如何在注解上使用SPEL表達(dá)式注入對(duì)象

    Spring AOP如何在注解上使用SPEL表達(dá)式注入對(duì)象

    這篇文章主要介紹了Spring AOP如何在注解上使用SPEL表達(dá)式注入對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java中的key接口解析

    java中的key接口解析

    這篇文章主要介紹了java中的key接口,有需要的朋友可以參考一下
    2014-01-01
  • 關(guān)于@Value注入List,Map及設(shè)置默認(rèn)值問題

    關(guān)于@Value注入List,Map及設(shè)置默認(rèn)值問題

    這篇文章主要介紹了@Value注入List,Map及設(shè)置默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 使用Okhttp實(shí)現(xiàn)上傳文件+參數(shù)請(qǐng)求接口form-data

    使用Okhttp實(shí)現(xiàn)上傳文件+參數(shù)請(qǐng)求接口form-data

    在進(jìn)行接口對(duì)接時(shí),常遇到需要傳遞多種類型參數(shù)及文件上傳的情況,解決此問題的關(guān)鍵在于參數(shù)傳遞和文件上傳的正確處理,在Service層和Controller層的傳參,可以通過@RequestParam標(biāo)注或直接使用請(qǐng)求實(shí)體類,但若結(jié)合文件上傳,則不應(yīng)使用@RequestBody注解
    2024-10-10
  • Spring Boot訪問靜態(tài)資源css/js,你真的懂了嗎

    Spring Boot訪問靜態(tài)資源css/js,你真的懂了嗎

    在搭建springboot時(shí)經(jīng)常需要在html中訪問一些靜態(tài)資源,很多朋友不清楚如何在 Spring Boot中訪問靜態(tài)資源,本文給大家?guī)?lái)兩種解決方案,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 冒泡排序算法原理及JAVA實(shí)現(xiàn)代碼

    冒泡排序算法原理及JAVA實(shí)現(xiàn)代碼

    關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底
    2014-01-01
  • 使用Spring Cloud Feign上傳文件的示例

    使用Spring Cloud Feign上傳文件的示例

    本篇文章主要介紹了使用Spring Cloud Feign上傳文件的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-12-12
  • 基于Java語(yǔ)言MD5加密Base64轉(zhuǎn)換方法

    基于Java語(yǔ)言MD5加密Base64轉(zhuǎn)換方法

    這篇文章主要為大家詳細(xì)介紹了基于Java語(yǔ)言的MD5加密Base64轉(zhuǎn)換方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java郵件亂碼的徹底解決方案

    java郵件亂碼的徹底解決方案

    在本篇文章里小編給大家整理的是關(guān)于java郵件亂碼的徹底解決方案,需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • Spring深入刨析聲明式事務(wù)

    Spring深入刨析聲明式事務(wù)

    在spring注解中,使用聲明式事務(wù),需要用到兩個(gè)核心的注解:@Transactional注解和@EnableTransactionManagement注解。將@Transactional注解加在方法上,@EnableTransactionManagement注解加在配置類上
    2022-12-12

最新評(píng)論

玛纳斯县| 本溪市| 安阳县| 南溪县| 龙游县| 油尖旺区| 陇川县| 芦溪县| 株洲市| 长沙县| 许昌市| 东乌珠穆沁旗| 阳谷县| 陵川县| 九台市| 万盛区| 上栗县| 金平| 油尖旺区| 临江市| 姚安县| 治县。| 柳河县| 江川县| 临清市| 石景山区| 武清区| 延吉市| 襄汾县| 将乐县| 昭苏县| 长丰县| 和顺县| 遵化市| 滦南县| 张北县| 定结县| 大港区| 察隅县| 桂平市| 泰兴市|