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

java??常見位邏輯運算符梳理

 更新時間:2022年08月30日 08:35:45   作者:JAVA旭陽???????  
這篇文章主要介紹了java常見位邏輯運算符梳理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參一下下面文章詳細內(nèi)容

概述

最近在看jdk一些集合的框架的時候,頻繁出現(xiàn)位運算,比如下圖,這對我閱讀源碼產(chǎn)生了很大的阻礙,因為我對這塊內(nèi)容也是一知半解,因為很少用過,即便學過基本也還給老師了,這篇文章主要針對java中的位運算做一個總結(jié)。

位運算符介紹

在Java語言中,提供了7種位運算符,分別是按位與(&)、按位或(|)、按位異或(^)、取反(~)、左移(<<)、帶符號右移(>>)和無符號右移(>>>)。位運算符是對long、int、short、byte和char這5種類型的數(shù)據(jù)進行運算的,我們不能對double、float和boolean進行位運算操作。

位運算符只要是正對二進制的數(shù)據(jù)進行操作,由于java中最終是按照補碼的方式存儲的,至于為什么按照補碼的方式,是另外一個話題了,按下不表。

正數(shù)的原碼和反碼、補碼一樣。負數(shù)的反碼:把原碼的符號位保持不變,數(shù)值位逐位取反,即可得原碼的反碼。負數(shù)的補碼:在反碼的基礎(chǔ)上加 1 即得該原碼的補碼。

位邏輯運算符

位邏輯運算符有以下4種,按位與(&)、按位或(|)、按位異或(^)、取反(~)。

位與(&)運算符

位與運算符為&,運算規(guī)則是:參與運算的數(shù)字,低位對齊,高位不足的補零,如果對應的二進制位同時為 1,那么計算結(jié)果才為 1,否則為 0。因此,任何數(shù)與 0 進行按位與運算,其結(jié)果都為 0,最左邊的符號位也是要參與運算的。

例子: 5&6

首先把5和6這兩個數(shù)字轉(zhuǎn)換為補碼,之后還要把這兩個數(shù)字按位對齊,然后一一把兩個相應的二進制位上的數(shù)字進行按位與運算,運算得到的二進制串就是最終的結(jié)果。

通過位與運算符特點推導出如下結(jié)論:

  • 任何數(shù)與 0 進行按位與運算,其結(jié)果都為 0

位或(|)運算符

位或運算符為|,其運算規(guī)則是:參與運算的數(shù)字,低位對齊,高位不足的補零。如果對應的二進制位只要有一個為 1,那么結(jié)果就為 1;如果對應的二進制位都為 0,結(jié)果才為 0。

例子: 5|6

首先還是把這兩個數(shù)字轉(zhuǎn)換成補碼形式,之后把相應的二進制位上的數(shù)字進行按位或運算:如果兩個二進制數(shù)都是0,計算結(jié)果為0,其他情況計算結(jié)果均為1。按照這個規(guī)則把每一位上的數(shù)字都計算一遍后,得到二進制的運算結(jié)果是111,這個運算結(jié)果轉(zhuǎn)換為十進制數(shù)是7。

通過位或運算符特點推導出如下結(jié)論:

  • 任何數(shù)與 0 進行按位或運算,其結(jié)果都是它本身
  • 任何數(shù)與 位數(shù)都是1的二進制進行按位或運算,其結(jié)果的二進制位數(shù)都是1

位異或(^)運算符

位異或運算符為^,其運算規(guī)則是:參與運算的數(shù)字,低位對齊,高位不足的補零,如果對應的二進制位相同(同時為 0 或同時為 1)時,結(jié)果為 0;如果對應的二進制位不相同,結(jié)果則為 1。

例子: 5^6

同樣是先轉(zhuǎn)成補碼,然后異或計算,得到最后的二進制結(jié)果11,轉(zhuǎn)成十進制為3。

通過異或運算符特點推導出如下結(jié)論:

  • 異或運算符滿足交換律,a^b與b^a是等價的。
  • 任何兩個相同的數(shù)字進行異或操作,所得到的結(jié)果都必然為0。
  • 對于任意一個二進制位來說,這個位上的數(shù)與0進行異或運算,運算結(jié)果與這個二進制位上的數(shù)是相同的,而與1進行異或運算,結(jié)果與這個二進制位上的數(shù)字相反。
  • 對于任何兩個整數(shù)a和b,a^b^b等于a, 對于任何兩個整數(shù)a和b,a^b^a等于b

位取反(~)運算符

位取反運算符為~,其運算規(guī)則是:只對一個操作數(shù)進行運算,將操作數(shù)二進制中的 1 改為 0,0 改為 1。

例子:對數(shù)字5取反

首先把數(shù)字5轉(zhuǎn)換成補碼形式,之后把每個二進制位上的數(shù)字進行取反,如果是0就變成1,如果1就變成0,經(jīng)過取反后得到的二進制串就是運算結(jié)果,此時是補碼的形式,需要轉(zhuǎn)回原碼,符號位為1,其余各位取反,然后再整個數(shù)加1, 這個運算結(jié)果被還原為十進制數(shù)是-6。

注意:位運算符的操作數(shù)只能是整型或者字符型數(shù)據(jù)以及它們的變體,不用于 float、double 或者 long 等復雜的數(shù)據(jù)類型。

位移位運算符

位移相關(guān)的運算符有三個,分別是左移(<<)、帶符號右移(>>)、無符號右移(>>>)。

左移運算符

左移位運算符為<<,其運算規(guī)則是:按二進制形式把所有的數(shù)字向左移動對應的位數(shù),高位移出(舍棄),低位的空位補零。

根據(jù)左移運算符可以推導出:

  • 左移運算有乘以2的N次方的效果。一個數(shù)向左移動1位,就相當于乘以2的1次方,移動兩位就相當于乘以2的2次方,也就是乘以4。

帶符號右移運算符

右位移運算符為>>,其運算規(guī)則是:符號位不變,按二進制形式把所有的數(shù)字向右移動對應的位數(shù),低位移出(舍棄),高位的空位補零。

根據(jù)帶符號右移運算符特點可以推導出:

  • 對于正數(shù)而言,帶符號右移之后產(chǎn)生的數(shù)字確實等于除以2的N次方。
  • 對于任何一個byte、short或者int類型的數(shù)據(jù)而言,帶符號右移31位之后,得到的必然是0或者是-1。對于long類型的數(shù)據(jù)而言,帶符號右移63位之后,得到的也必然是0或者是-1。

無符號右移

無符號右移運算符為>>>, 其運算規(guī)則是:無符號右移在二進制串移動之后,空位由0來補充,與符號位是0還是1毫無關(guān)系,注意這里的無符號是忽略符號位,也參與移位。

常見的位運算

  • 計算m*2^n
System.out.println("2^3=" + (1 << 3));// 2^3=8
System.out.println("3*2^3=" + (3 << 3));// 3*2^3=24
System.out.println("5*2^3=" + (5 << 3));// 5*2^3=40
  • 判斷一個數(shù)n的奇偶性
System.out.println((5 & 1) == 1 ? "奇數(shù)" : "偶數(shù)"); // 奇數(shù)
System.out.println((6 & 1) == 1 ? "奇數(shù)" : "偶數(shù)"); // 偶數(shù)
System.out.println((0 & 1) == 1 ? "奇數(shù)" : "偶數(shù)"); // 偶數(shù)
System.out.println((-1 & 1) == 1 ? "奇數(shù)" : "偶數(shù)"); // 奇數(shù)
System.out.println((-2 & 1) == 1 ? "奇數(shù)" : "偶數(shù)"); // 偶數(shù)
  • 取絕對值
System.out.println((-5 ^ (-5 >> 31)) - (-5 >> 31));// 5
System.out.println((0 ^ (0 >> 31)) - (0 >> 31));// 0

4個字節(jié) 32位,a>>31取得a的符號;

任何正數(shù)右移31后只剩符號位0,溢出的31位截斷,空出的31位補符號位0,最終結(jié)果為0;

任何負數(shù)右移31后只剩符號位1,溢出的31位截斷,空出的31位補符號位1,最終結(jié)果為 -1;

正數(shù) ^ 0 = 正數(shù)本身(二進制不變);

負數(shù) ^ -1 = 它的絕對值 -1(二進制翻轉(zhuǎn)每一位);

總結(jié)

位運算符這塊個人覺得還是挺復雜的,還是需要不斷的加深學習和理解。這里強調(diào)一點,位運算計算后,不會影響值得本身,比如 int a=5; ~a; 這個a本身并沒有改變。另一方面,位運算的效率是遠遠大于直接計算的。

到此這篇關(guān)于java  位邏輯運算符詳細解說的文章就介紹到這了,更多相關(guān)java 位邏輯運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • maven升級版本后報錯:Blocked mirror for repositories

    maven升級版本后報錯:Blocked mirror for repositories

    本文主要介紹了maven升級版本后報錯:Blocked mirror for repositories,文中的解決方法非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 一文帶你入門SpringMVC的配置與使用

    一文帶你入門SpringMVC的配置與使用

    Spring MVC是Spring Framework的一部分,是基于Java實現(xiàn)MVC的輕量級Web框架。本文將通過一些簡單示例帶大家掌握SpringMVC的配置與使用,感興趣的可以了解一下
    2022-11-11
  • 詳解Java如何跨平臺獲取MAC地址

    詳解Java如何跨平臺獲取MAC地址

    有時我們因為軟件授權(quán)或者其它需要獲取主機唯一標識而需要獲取用戶主機的MAC地址,而本文則將介紹如何通過Java來實現(xiàn)跨平臺獲取MAC地址的兩種方法,需要的朋友可以參考下
    2021-06-06
  • Spring security認證兩類用戶代碼實例

    Spring security認證兩類用戶代碼實例

    這篇文章主要介紹了Spring security認證兩類用戶代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 使用RedisAtomicLong優(yōu)化性能問題

    使用RedisAtomicLong優(yōu)化性能問題

    這篇文章主要介紹了使用RedisAtomicLong優(yōu)化性能問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解MyBatis XML配置解析

    詳解MyBatis XML配置解析

    這篇文章主要介紹了詳解MyBatis XML配置解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Spring事件監(jiān)聽機制觀察者模式詳解

    Spring事件監(jiān)聽機制觀察者模式詳解

    這篇文章主要為大家介紹了Spring事件監(jiān)聽機制觀察者模式實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 淺析Spring容器原始Bean是如何創(chuàng)建的

    淺析Spring容器原始Bean是如何創(chuàng)建的

    這篇文章主要是想和小伙伴們一起聊聊?Spring?容器創(chuàng)建?Bean?最最核心的?createBeanInstance?方法,文中的示例代碼講解詳細,需要的可以參考一下
    2023-08-08
  • SpringCloud項目中集成Sentinel問題

    SpringCloud項目中集成Sentinel問題

    在SpringCloud項目中集成Sentinel,可以實現(xiàn)流量控制、熔斷降級等功能,提升系統(tǒng)穩(wěn)定性和可用性,集成步驟包括添加Sentinel依賴、配置控制臺地址、啟動控制臺、配置限流熔斷規(guī)則、使用注解和集成SpringCloudGateway,這有助于處理高并發(fā)場景,保護服務穩(wěn)定運行
    2024-10-10
  • kafka添加安全驗證配置方式

    kafka添加安全驗證配置方式

    這篇文章主要介紹了kafka添加安全驗證配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

水富县| 尖扎县| 甘德县| 开阳县| 江津市| 承德县| 麻城市| 仙游县| 察哈| 凤凰县| 兴化市| 武定县| 邵阳县| 嵊泗县| 建始县| 江城| 莲花县| 潮安县| 师宗县| 礼泉县| 汽车| 文安县| 伽师县| 枣强县| 库尔勒市| 巴彦淖尔市| 璧山县| 聊城市| 三都| 巴塘县| 南京市| 施甸县| 讷河市| 遂川县| 舒兰市| 黔西县| 松桃| 无锡市| 渝中区| 谢通门县| 宜城市|