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

Java中特殊運(yùn)算符及其應(yīng)用詳解

 更新時(shí)間:2023年08月24日 14:30:01   作者:是江迪呀  
當(dāng)涉及位操作和位級(jí)運(yùn)算時(shí),Java?提供了一組特殊的運(yùn)算符,即左移(<<)和右移(>>)運(yùn)算符,下面小編就帶大家深入了解一下它們的具體應(yīng)用吧

一、前言

當(dāng)涉及位操作和位級(jí)運(yùn)算時(shí),Java 提供了一組特殊的運(yùn)算符,即左移(<<)和右移(>>)運(yùn)算符。這些運(yùn)算符與普通的算術(shù)和邏輯運(yùn)算符不同,它們操作的是數(shù)字的二進(jìn)制位。位操作是計(jì)算機(jī)底層編程中常用的技巧,能夠高效地執(zhí)行一些操作,如數(shù)值乘除以2的冪次方,處理標(biāo)志位,以及在一些位級(jí)編碼場景下進(jìn)行數(shù)據(jù)處理。

左移和右移運(yùn)算符用于將二進(jìn)制位向左或向右移動(dòng)指定的位數(shù),從而實(shí)現(xiàn)對(duì)數(shù)值的快速操作。左移操作將數(shù)值的二進(jìn)制表示向左移動(dòng),等效于乘以2的冪次方,而右移操作將數(shù)值的二進(jìn)制表示向右移動(dòng),等效于除以2的冪次方。這些運(yùn)算符在處理大數(shù)據(jù)集、位掩碼、網(wǎng)絡(luò)協(xié)議以及嵌入式系統(tǒng)等領(lǐng)域都具有廣泛的應(yīng)用。

然而,需要注意的是,位操作并不常見于一般的業(yè)務(wù)邏輯編程,而更多地出現(xiàn)在需要對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行處理的底層系統(tǒng)級(jí)編程中。在使用位操作時(shí),應(yīng)該清晰地理解位操作的語義,防止出現(xiàn)意外錯(cuò)誤。同時(shí),要考慮到可讀性和代碼維護(hù)性,不應(yīng)濫用位操作,而是在合適的場景下使用,以提高代碼的效率和性能。

二、Java的左移、右移運(yùn)算符

  • << 是左移;如:<<1就是左移一位;<<2就是左移兩位
  • >>”是右移;如:>>1就是右移一位;>>2就是右移兩位

記憶技巧: 尖括號(hào)的方向朝向哪就是哪移。

左移就是將目標(biāo)轉(zhuǎn)換為二進(jìn)制后,從右向左移動(dòng)一位,右邊補(bǔ)零,左邊移除。

右移就是將目標(biāo)轉(zhuǎn)換為二進(jìn)制后,從左向右移動(dòng)一位,左邊補(bǔ)零,右邊移除。。

三、Java中左移、右移使用場景

可以代替乘(左移)和除(右移),如下:

package zd.hjd.test.synchronizedtest;
public class MyTestMain {
    public static void main(String[] args) {
        System.out.println(4*2);
        System.out.println(4<<1);
        System.out.println(4/2);
        System.out.println(4>>1);
    }
}

輸出結(jié)果:

8
8
2
2

四、使用左移、右移優(yōu)點(diǎn)和弊端

4.1 優(yōu)點(diǎn)

使用左移(<<)和右移(>>)的好處在于它們可以在某些情況下提供更高效的數(shù)值操作,特別是涉及到2的冪次方的操作。以下是一些使用左移右移的好處:

  • 速度優(yōu)勢(shì): 左移和右移操作是位級(jí)操作,它們?cè)诘讓又苯訉?duì)二進(jìn)制數(shù)據(jù)進(jìn)行移動(dòng),相比于使用乘除法運(yùn)算符,位移操作可以更快地完成數(shù)值的變換。這在一些需要高效計(jì)算的場景下尤為重要。
  • 數(shù)值操作: 左移和右移可以用于實(shí)現(xiàn)數(shù)值的倍增或減少。例如,將一個(gè)數(shù)值左移n位,等效于將其乘以2的n次方;將一個(gè)數(shù)值右移n位,等效于將其除以2的n次方。
  • 位掩碼操作: 在位掩碼操作中,可以使用左移來設(shè)置位,使用右移來讀取位。這在一些標(biāo)志位、開關(guān)狀態(tài)的處理中非常有用。
  • 位級(jí)編碼: 在某些編碼和解碼場景下,需要將信息編碼到特定的位上,或者從特定位上解碼信息。左移和右移操作可以用于實(shí)現(xiàn)這種位級(jí)的數(shù)據(jù)處理。
  • 嵌入式系統(tǒng): 在嵌入式系統(tǒng)中,資源有限,效率至關(guān)重要。位移操作可以提供更緊湊和高效的代碼,減少資源消耗。

4.2 弊端

  • 可讀性下降: 左移和右移操作對(duì)于非熟悉位操作的開發(fā)者來說可能不太直觀,代碼的可讀性可能會(huì)下降,使得代碼難以理解和維護(hù)。
  • 位移越界: 在使用右移操作時(shí),如果對(duì)有符號(hào)的整數(shù)進(jìn)行右移,可能會(huì)導(dǎo)致符號(hào)位擴(kuò)展,從而改變數(shù)值的意義。例如,對(duì)于負(fù)數(shù)的右移可能會(huì)導(dǎo)致意外的結(jié)果。
  • 移位溢出: 如果使用左移操作將某個(gè)位移到超出數(shù)據(jù)類型的范圍,就會(huì)發(fā)生移位溢出,導(dǎo)致結(jié)果不正確。
  • 代碼依賴于底層實(shí)現(xiàn): 使用位操作可能會(huì)使代碼與底層硬件或編譯器的實(shí)現(xiàn)相關(guān),導(dǎo)致代碼的可移植性下降。
  • 復(fù)雜邏輯錯(cuò)誤: 如果沒有正確地處理邊界情況,可能會(huì)導(dǎo)致復(fù)雜的邏輯錯(cuò)誤,尤其是在涉及位級(jí)運(yùn)算的復(fù)雜算法中。
  • 難以維護(hù): 過度使用位操作可能使代碼變得難以理解和維護(hù),特別是在邏輯復(fù)雜的情況下。
  • 代碼不易調(diào)試: 位操作可能會(huì)導(dǎo)致一些難以調(diào)試的問題,因?yàn)樗鼈兩婕暗讓游患?jí)表示,而不是更常見的數(shù)值操作。

五、使用左移、右移注意事項(xiàng)

1.帶符號(hào)左移需要考慮移動(dòng)后數(shù)字變?yōu)樨?fù)數(shù)的情況,因?yàn)槎M(jìn)制的首位為符號(hào)位。

2.從上述中我們知道,左移就是將一個(gè)數(shù)字的二進(jìn)制編碼向左邊移動(dòng),右邊補(bǔ)零,右移相反。如果一個(gè)int類型的數(shù)字向左移32位結(jié)果是不是就是0呢?答案是錯(cuò)誤的。當(dāng)int類型數(shù)字進(jìn)行左移,并且左移位數(shù)大于等于32位時(shí),會(huì)先與32求余,然再進(jìn)行移動(dòng)。32%32 = 0,使用int類型向左移32位相當(dāng)于不移動(dòng),byteshort類型同理。long類型是64位。

public class MoveLeft {
    public static void main(String[] args) {
       int a = 10;
        byte b = 50;
        short s = 60;
        System.out.println(a >> 1);// 5
        System.out.println(a << 1);// 20
        System.out.println(a << 32);// 10
        System.out.println(a << 33);// 20
        System.out.println(b << 32);// 50
        System.out.println(b << 33);// 100
        System.out.println(s << 32);// 60
        System.out.println(s << 33);// 120
        long longValue = 733183670L;
        System.out.println("longValue:" + (longValue));//打印longValue
        System.out.println("longValue左移1位:" + (longValue << 1));//左移1位
        System.out.println("longValue左移8位:" + (longValue << 8));//左移8位
        //當(dāng)long類型左移位數(shù)大于等于64位操作時(shí),會(huì)先求余后再進(jìn)行移位操作
        System.out.println("longValue左移64位:" + (longValue << 64));//求余為64%64=0,相當(dāng)于左移0位(不移位)
        System.out.println("longValue左移72位:" + (longValue << 72));//求余為72%64=8,相當(dāng)于左移8位
        System.out.println("longValue左移128位:" + (longValue << 128));//求余為128%64=0,相當(dāng)于左移0位(不移位)
    }
}

3.double和float不能使用位移來操作,編譯不通過。

六、無符號(hào)右移>>>

無符號(hào)右移和右移原理一樣,只不過是右移后在左邊補(bǔ)零后舍棄掉符號(hào)位。如下所示:

public class MoveLeft {
    public static void main(String[] args) {
        int a = -10;
        System.out.println(a >>> 1);// 結(jié)果是 2147483643
    }
}

執(zhí)行的過程如下:

//向得出-10的二進(jìn)制,需要得到10的二進(jìn)制
0000 0000 0000 0000 0000 0000 0000 ??1010??// 10 二進(jìn)制如下
1111 1111 1111 1111 1111 1111 1111 0101// 10 的反碼
1111 1111 1111 1111 1111 1111 1111 0110 //反碼+1 就為 -10 的二進(jìn)制
0111 1111 1111 1111 1111 1111 1111 1011// 右移一位
//轉(zhuǎn)換為10進(jìn)制 為 2147483643

記住Java中沒有無符號(hào)左移。因?yàn)樽笠撇僮鞣?<< 總是保持符號(hào)位,即使在移動(dòng)過程中可能會(huì)導(dǎo)致符號(hào)位變?yōu)?。如果需要進(jìn)行無符號(hào)左移操作,可以使用無符號(hào)右移操作 >>> 來實(shí)現(xiàn)。因?yàn)樵诖蠖鄶?shù)情況下,無符號(hào)左移和無符號(hào)右移的效果是一樣的,都是向左或向右移動(dòng)指定位數(shù),只是填充的位不同。

七、Java中的其它特殊運(yùn)算符

7.1 &

按位與運(yùn)算 &是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)制位相與。只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1 ,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。

使用場景:

  • 位操作: 位運(yùn)算符在底層數(shù)據(jù)處理和優(yōu)化中很常見,例如對(duì)數(shù)據(jù)進(jìn)行位掩碼、位清除、位設(shè)置等操作。
  • 權(quán)限控制: 在權(quán)限控制中,可以使用位運(yùn)算來對(duì)不同權(quán)限進(jìn)行組合或判斷。
  • 位集合: 將每個(gè)位視為一個(gè)標(biāo)志,可以通過按位與運(yùn)算來檢查是否設(shè)置了特定的標(biāo)志位。

例如,如果有一個(gè)整數(shù) a 表示某個(gè)權(quán)限的掩碼,另一個(gè)整數(shù) b 表示用戶的權(quán)限,通過 a & b 運(yùn)算可以判斷用戶是否具有某個(gè)權(quán)限。

7.2 |

按位或運(yùn)算 |是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)制位相或。只要兩數(shù)的二進(jìn)制位中有一個(gè)是1,那么按位或的結(jié)果就是1;只有二進(jìn)制兩位都為0時(shí),結(jié)果為0。

使用場景:

  • 位操作: 位運(yùn)算符在底層數(shù)據(jù)處理和優(yōu)化中很常見,例如對(duì)數(shù)據(jù)進(jìn)行位標(biāo)記、位組合等操作。
  • 權(quán)限控制: 在權(quán)限控制中,可以使用位運(yùn)算來對(duì)不同權(quán)限進(jìn)行組合或判斷。
  • 位集合: 將每個(gè)位視為一個(gè)標(biāo)志,可以通過按位或運(yùn)算來設(shè)置特定的標(biāo)志位。

例如,如果有一個(gè)整數(shù) a 表示某個(gè)權(quán)限的掩碼,另一個(gè)整數(shù) b 表示用戶的權(quán)限,通過 a | b 運(yùn)算可以將用戶的權(quán)限添加到掩碼中。

7.3 ^

按位異或運(yùn)算 ~是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)制位相異或。兩個(gè)數(shù)字的二進(jìn)制位相同則取0,不同值則取1。

異或運(yùn)算符具有以下的性質(zhì):

(1)交換律: (2)結(jié)合律:

(a^b)^c == a^(b^c)

(3)對(duì)于任何數(shù)X,都有:

x^x=0,x^0=x

(4)自反性

A XOR B XOR B = A xor 0 = A

使用場景:

異或運(yùn)算最常見于多項(xiàng)式除法,不過它最重要的性質(zhì)還是自反性A XOR B XOR B = A,即對(duì)給定的數(shù)A,用同樣的運(yùn)算因子(B)作兩次異或運(yùn)算后仍得到A本身。這是一個(gè)神奇的性質(zhì),利用這個(gè)性質(zhì),可以獲得許多有趣的應(yīng)用。

例如,大部分程序教科書都會(huì)向初學(xué)者指出,要交換兩個(gè)變量的值,必須要引入一個(gè)中間變量。但如果使用異或,就可以節(jié)約一個(gè)變量的存儲(chǔ)空間: 設(shè)有A,B兩個(gè)變量,存儲(chǔ)的值分別為a,b,則以下三行表達(dá)式將互換他們的值 表達(dá)式 (值) :

A=A XOR B (a XOR b) 
B=B XOR A (b XOR a XOR b = a)
A=A XOR B (a XOR b XOR a = b)

public class MyTestMain {
    public static void main(String[] args) {
        int a = 5;
        int b = 6;
        a = a^b;
        b = a^b;
        a = a^b;
        System.out.println("a:" + a);
        System.out.println("b:" + b);
    }
}

輸出結(jié)果:

a:6
b:5

google的一個(gè)面試題:

一個(gè)數(shù)組存放若干整數(shù),一個(gè)數(shù)出現(xiàn)奇數(shù)次,其余數(shù)均出現(xiàn)偶數(shù)次,找出這個(gè)出現(xiàn)奇數(shù)次的數(shù)?

上面的問題可以使用按位異或運(yùn)算巧妙解決:

public class MyTestMain {
    public static void main(String[] args) {
        int[] nums = {2, 2, 3, 3, 4, 4, 5};
        int returnValue = 0;
        for (int num : nums) {
            returnValue ^= num;
        }
        System.out.println(returnValue);
    }
}

輸出結(jié)果:

5

以上就是Java中特殊運(yùn)算符及其應(yīng)用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java特殊運(yùn)算符的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java計(jì)算日期相差天數(shù)的4種簡單方法舉例

    java計(jì)算日期相差天數(shù)的4種簡單方法舉例

    最近在工作中遇見一個(gè)小需求,要求計(jì)算兩個(gè)日期之間相差幾天,下面這篇文章主要給大家介紹了關(guān)于java計(jì)算日期相差天數(shù)的4種簡單方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例

    Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例

    這篇文章主要介紹了Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • java設(shè)計(jì)模式之單例模式

    java設(shè)計(jì)模式之單例模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java中JSON字符串反序列化(動(dòng)態(tài)泛型)

    Java中JSON字符串反序列化(動(dòng)態(tài)泛型)

    文章討論了在定時(shí)任務(wù)中使用反射調(diào)用目標(biāo)對(duì)象時(shí)處理動(dòng)態(tài)參數(shù)的問題,通過將方法參數(shù)存儲(chǔ)為JSON字符串并進(jìn)行反序列化,可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)用,然而,這種方式容易導(dǎo)致內(nèi)存溢出(OOM),這篇文章主要介紹了JSON字符串反序列化?動(dòng)態(tài)泛型,需要的朋友可以參考下
    2024-12-12
  • SpringMVC前端和后端數(shù)據(jù)交互總結(jié)

    SpringMVC前端和后端數(shù)據(jù)交互總結(jié)

    本篇文章主要介紹了SpringMVC前端和后端數(shù)據(jù)交互總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 基于Java回顧之集合的總結(jié)概述

    基于Java回顧之集合的總結(jié)概述

    在這篇文章里,我們關(guān)注Java中的集合(Collection)。集合是編程語言中基礎(chǔ)的一部分,Java自JDK早期,就引入了Java Collection Framework。設(shè)計(jì)JCF的那個(gè)人,后來還寫了一本書,叫《Effective Java》
    2013-05-05
  • SpringBoot JdbcTemplate批量操作的示例代碼

    SpringBoot JdbcTemplate批量操作的示例代碼

    本篇文章主要介紹了SpringBoot JdbcTemplate批量操作的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • IntelliJ IDEA語法報(bào)錯(cuò)

    IntelliJ IDEA語法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA語法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • mybatis-plus如何使用mapper的xml

    mybatis-plus如何使用mapper的xml

    這篇文章主要介紹了mybatis-plus如何使用mapper的xml問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決

    MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了MyBatis使用<foreach>標(biāo)簽報(bào)錯(cuò)問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論

武鸣县| 班玛县| 建德市| 蒙阴县| 普兰县| 合山市| 林口县| 麻城市| 林芝县| 东乌珠穆沁旗| 张家港市| 库车县| 潍坊市| 郸城县| 玛曲县| 桓台县| 城固县| 府谷县| 浮山县| 汾阳市| 土默特左旗| 香格里拉县| 辽源市| 庆元县| 绥化市| 通河县| 通化县| 珲春市| 专栏| 科尔| 宜兰市| 陇西县| 调兵山市| 山东| 安龙县| 宁强县| 宜城市| 建湖县| 东乡| 元氏县| 织金县|