欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

位掩碼

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

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

舉個例子

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

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

編碼

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

String?stringRepresentation?=?"01000001010000010100000100000011";

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

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

解碼

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

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

提取一個比特

第一比特

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

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

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

intRepresentation?&?1?!=?0

任意位置的位

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

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

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

00000000000000000000000000000100

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

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

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

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

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

提取多個比特

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

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

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

我們將把二進制的字符串表示法分成8個字符的組,把它們解析成char變量,然后把它們連接成一個最終的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)用一個比特掩碼

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

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

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

因為我們的用戶有一個活躍的賬戶,但它不是高級賬戶,所以被屏蔽的值將只有第一個比特被設(shè)置為1。

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

現(xiàn)在,我們可以輕松而廉價地斷言一個用戶是否符合我們的條件。

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

總結(jié)

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

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

相關(guān)文章

  • java中的內(nèi)部類詳細總結(jié)

    java中的內(nèi)部類詳細總結(jié)

    內(nèi)部類不是很好理解,但說白了其實也就是一個類中還包含著另外一個類。如同一個人是由大腦、肢體、器官等身體結(jié)果組成,而內(nèi)部類相當(dāng)于其中的某個器官之一,例如心臟:它也有自己的屬性和行為(血液、跳動)
    2013-10-10
  • SpringBoot使用@Scheduled實現(xiàn)定時任務(wù)的并行執(zhí)行

    SpringBoot使用@Scheduled實現(xiàn)定時任務(wù)的并行執(zhí)行

    在SpringBoot中,如果使用@Scheduled注解來定義多個定時任務(wù),默認情況下這些任務(wù)將會被安排在一個單線程的調(diào)度器中執(zhí)行,這意味著,這些任務(wù)將會串行執(zhí)行,而不是并行執(zhí)行,本文介紹了SpringBoot使用@Scheduled實現(xiàn)定時任務(wù)的并行執(zhí)行,需要的朋友可以參考下
    2024-06-06
  • IDEA 開發(fā)多項目依賴的方法(圖文)

    IDEA 開發(fā)多項目依賴的方法(圖文)

    這篇文章主要介紹了IDEA 開發(fā)多項目依賴的方法(圖文),本文講一下關(guān)于使用IntelliJ IDEA基于Maven創(chuàng)建多模塊項目的實際開發(fā),非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實現(xiàn)過程詳解

    Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實現(xiàn)過程詳解

    這篇文章主要介紹了Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實現(xiàn)

    Java微信公眾平臺開發(fā)(5) 文本及圖文消息回復(fù)的實現(xiàn)

    這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第五步,回文本及圖文消息回復(fù)的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java如何獲取指定目錄文件列表

    Java如何獲取指定目錄文件列表

    這篇文章主要介紹了Java如何獲取指定目錄文件列表,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java原生序列化和反序列化代碼實例

    Java原生序列化和反序列化代碼實例

    這篇文章主要介紹了Java原生序列化和反序列化代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot快速搭建實現(xiàn)三步驟解析

    SpringBoot快速搭建實現(xiàn)三步驟解析

    這篇文章主要介紹了SpringBoot快速搭建實現(xiàn)三步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 教你在一分鐘之內(nèi)理解Java Lambda表達式并學(xué)會使用

    教你在一分鐘之內(nèi)理解Java Lambda表達式并學(xué)會使用

    今天給大家?guī)У奈恼率荍ava8新特性的相關(guān)知識,文章圍繞著如何在一分鐘之內(nèi)理解Java Lambda表達式并學(xué)會使用展開,文中有非常詳細的介紹,需要的朋友可以參考下
    2021-06-06
  • java外部類與內(nèi)部類的關(guān)系詳解

    java外部類與內(nèi)部類的關(guān)系詳解

    本文詳細講解了java外部類與內(nèi)部類的關(guān)系,用代碼演示了外部類調(diào)用內(nèi)部類的方法。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12

最新評論