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

詳解Java如何利用位操作符創(chuàng)建位掩碼

 更新時(shí)間:2022年10月17日 09:34:40   作者:指北君  
在本文中,我們來看看如何使用位操作符實(shí)現(xiàn)低級(jí)別的位掩碼。我們將看到我們?nèi)绾螌⒁粋€(gè)單一的int變量作為一個(gè)單獨(dú)的數(shù)據(jù)容器,感興趣的可以跟隨小編一起學(xué)習(xí)一下

在本文中,我們來看看如何使用位操作符實(shí)現(xiàn)低級(jí)別的位掩碼。我們將看到我們?nèi)绾螌⒁粋€(gè)單一的int變量作為一個(gè)單獨(dú)的數(shù)據(jù)容器。

位掩碼

位掩碼允許我們?cè)谝粋€(gè)數(shù)字變量中存儲(chǔ)多個(gè)值。我們不再把這個(gè)變量看作一個(gè)整數(shù),而是把它的每一個(gè)比特當(dāng)作一個(gè)獨(dú)立的值。

因?yàn)橐粋€(gè)比特可以等于 0 或 1,我們也可以把它看成是 false 或 true 。我們也可以把一組比特切開,把它們當(dāng)作一個(gè)較小的數(shù)字變量甚至是一個(gè)String

舉個(gè)例子

假設(shè)我們有一個(gè)最小的內(nèi)存空間,并且需要在一個(gè)int變量中存儲(chǔ)所有關(guān)于用戶賬戶的信息。前八位(來自32個(gè)可用位)將存儲(chǔ)boolean信息,如 "該賬戶是否激活?"或 "該賬戶是否溢價(jià)?"

至于剩下的24位,我們將把它們轉(zhuǎn)換成三個(gè)字符,作為用戶的標(biāo)識(shí)符。

編碼

我們的用戶將有一個(gè)標(biāo)識(shí)符 "AAA",他將有一個(gè)活躍的高級(jí)賬戶(存儲(chǔ)在前兩個(gè)比特)。在二進(jìn)制表示中,它將看起來像。

String?stringRepresentation?=?"01000001010000010100000100000011";

使用內(nèi)置的Integer#parseUnsignedInt方法,可以很容易地將其編碼為一個(gè)int變量。

int?intRepresentation?=?Integer.parseUnsignedInt(stringRepresentation,?2);
assertEquals(intRepresentation,?1094795523);

解碼

這個(gè)過程也可以用 Integer#toBinaryString 方法來反轉(zhuǎn)。

String?binaryString?=?Integer.toBinaryString(intRepresentation);
String?stringRepresentation?=?padWithZeros(binaryString);
assertEquals(stringRepresentation,?"01000001010000010100000100000011");

提取一個(gè)比特

第一比特

如果我們想檢查我們賬戶變量的第一位,我們只需要使用順位 and 運(yùn)算符和數(shù)字 1 作為掩碼。因?yàn)閿?shù)字 1在二進(jìn)制形式中只有第一位被設(shè)置為1,其余的都是0,它將從我們的變量中刪除所有的位,只留下第一個(gè)完整的位。

10000010100000101000001000000011
00000000000000000000000000000001
--------------------------------?&
00000000000000000000000000000001

然后我們需要檢查產(chǎn)生的值是否不等于零。

intRepresentation?&?1?!=?0

任意位置的位

如果我們想檢查其他的位,我們需要?jiǎng)?chuàng)建一個(gè)適當(dāng)?shù)难诖a,這個(gè)掩碼需要在給定的位置上有一個(gè)位設(shè)置為1,其余的設(shè)置為0。最簡單的方法是對(duì)我們已有的掩碼進(jìn)行移位。

1?<<?(position?-?1)

上面這行代碼的位置變量設(shè)置為3,將把我們的掩碼從 00000000000000000000000000000001 變成

00000000000000000000000000000100

因此,現(xiàn)在,比特方程將看起來像這樣。

10000010100000101000001000000011
00000000000000000000000000000100
-------------------------------- &
00000000000000000000000000000000

把所有這些放在一起,我們可以寫一個(gè)方法來提取給定位置上的單個(gè)比特。

private?boolean?extractValueAtPosition(int?intRepresentation,?int?position)?{
????return?((intRepresentation)?&?(1?<<?(position?-?1)))?!=?0;
}

為了達(dá)到同樣的效果,我們也可以將intRepresentation變量向相反方向移動(dòng),而不是改變掩碼。

提取多個(gè)比特

我們可以用類似的方法從一個(gè)整數(shù)中提取多個(gè)比特。讓我們提取我們的用戶帳戶變量的最后三個(gè)字節(jié),并將其轉(zhuǎn)換為一個(gè)字符串。首先,我們需要通過將變量向右移動(dòng)來擺脫前八位的影響。

int?lastThreeBites?=?intRepresentation?>>?8;
String?stringRepresentation?=?getStringRepresentation(lastThreeBites);
assertEquals(stringRepresentation,?"00000000010000010100000101000001");

我們?nèi)匀挥?2位,因?yàn)?code>int總是有32位。然而,現(xiàn)在我們只對(duì)前24位感興趣,其余的都是零,會(huì)很容易被忽略。我們創(chuàng)建的int變量可以很容易地用作整數(shù)ID,但是因?yàn)槲覀兿胗幸粋€(gè)字符串ID,所以我們還有一個(gè)步驟要做。

我們將把二進(jìn)制的字符串表示法分成8個(gè)字符的組,把它們解析成char變量,然后把它們連接成一個(gè)最終的String

為了方便起見,我們還將忽略空字節(jié)。

Arrays.stream(stringRepresentation.split("(?<=\\G.{8})"))
??.filter(eightBits?->?!eightBits.equals("00000000"))
??.map(eightBits?->?(char)Integer.parseInt(eightBits,?2))
??.collect(StringBuilder::new,?StringBuilder::append,?StringBuilder::append)
??.toString();

應(yīng)用一個(gè)比特掩碼

我們也可以創(chuàng)建一個(gè)掩碼來同時(shí)檢查許多位,而不是提取和檢查單個(gè)位的值。我們想檢查我們的用戶是否有一個(gè)活躍的高級(jí)賬戶,所以他的變量的前兩個(gè)比特都設(shè)置為1。

我們可以用以前的方法分別檢查它們,但創(chuàng)建一個(gè)掩碼來選擇它們,會(huì)更快。

int?user?=?Integer.parseUnsignedInt("00000000010000010100000101000001",?2);
int?mask?=?Integer.parseUnsignedInt("00000000000000000000000000000011",?2);
int?masked?=?user?&?mask;

因?yàn)槲覀兊挠脩粲幸粋€(gè)活躍的賬戶,但它不是高級(jí)賬戶,所以被屏蔽的值將只有第一個(gè)比特被設(shè)置為1。

assertEquals(getStringRepresentation(masked),?"00000000000000000000000000000001");

現(xiàn)在,我們可以輕松而廉價(jià)地?cái)嘌砸粋€(gè)用戶是否符合我們的條件。

assertFalse((user?&?mask)?==?mask);

總結(jié)

在本教程中,我們學(xué)習(xí)了如何使用位運(yùn)算符來創(chuàng)建位掩碼,并應(yīng)用它們來從整數(shù)中提取二進(jìn)制信息。

到此這篇關(guān)于詳解Java如何利用位操作符創(chuàng)建位掩碼的文章就介紹到這了,更多相關(guān)Java位操作符創(chuàng)建位掩碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Arrays工具類的一些常見方法總結(jié)

    Java中Arrays工具類的一些常見方法總結(jié)

    在Java中Arrays類是一個(gè)實(shí)用工具類,用于在數(shù)組上執(zhí)行各種操作,包括排序、搜索、比較等,這篇文章主要給大家介紹了關(guān)于Java中Arrays工具類的一些常見方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Java中獲取Class對(duì)象的三種方式詳解

    Java中獲取Class對(duì)象的三種方式詳解

    本文介紹了Java中獲取Class對(duì)象的三種常見方式:使用.class語法、使用Class.forName()方法以及使用.getClass()方法,需要的朋友可以參考下
    2023-12-12
  • Java ArrayList擴(kuò)容問題實(shí)例詳解

    Java ArrayList擴(kuò)容問題實(shí)例詳解

    這篇文章主要介紹了Java ArrayList擴(kuò)容問題實(shí)例詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • SpringMVC請(qǐng)求的路徑變量里面寫正則表達(dá)式的方法

    SpringMVC請(qǐng)求的路徑變量里面寫正則表達(dá)式的方法

    這篇文章主要介紹了SpringMVC請(qǐng)求的路徑變量里面寫正則表達(dá)式的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效)

    spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效)

    這篇文章主要介紹了spring項(xiàng)目如何配置多數(shù)據(jù)源(已上生產(chǎn),親測(cè)有效),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • eclipse創(chuàng)建springboot項(xiàng)目的三種方式總結(jié)

    eclipse創(chuàng)建springboot項(xiàng)目的三種方式總結(jié)

    這篇文章主要介紹了eclipse創(chuàng)建springboot項(xiàng)目的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java的JNI快速入門教程(推薦)

    Java的JNI快速入門教程(推薦)

    下面小編就為大家?guī)硪黄狫ava的JNI快速入門教程(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • SpringBoot接入支付寶支付的方法步驟

    SpringBoot接入支付寶支付的方法步驟

    這篇文章主要介紹了SpringBoot接入支付寶支付的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java使用多線程讀取超大文件

    java使用多線程讀取超大文件

    這篇文章主要為大家詳細(xì)介紹了java使用多線程讀取超大文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java使用自動(dòng)化部署工具Gradle中的任務(wù)設(shè)定教程

    Java使用自動(dòng)化部署工具Gradle中的任務(wù)設(shè)定教程

    Grandle使用同樣運(yùn)行于JVM上的Groovy語言編寫,本文會(huì)對(duì)此進(jìn)行初步夠用的講解,接下來我們就一起來看一下Java使用自動(dòng)化部署工具Gradle中的任務(wù)設(shè)定教程:
    2016-06-06

最新評(píng)論

龙南县| 莱阳市| 南丹县| 榆社县| 青州市| 内丘县| 十堰市| 石城县| 石嘴山市| 虞城县| 梅河口市| 吉林市| 重庆市| 衡山县| 织金县| 峨眉山市| 平舆县| 承德市| 湖北省| 长寿区| 多伦县| 长宁县| 湛江市| 邢台市| 皮山县| 南澳县| 吉安县| 手机| 翁牛特旗| 辛集市| 米易县| 依兰县| 广河县| 灵武市| 宁都县| 江华| 古浪县| 江达县| 神农架林区| 阜城县| 株洲市|