av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

提取信息,Java還有這個(gè)操作!你明白了嗎?

大家好,我是指北君。

專注于為中小企業(yè)提供做網(wǎng)站、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)廣德免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了數(shù)千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

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

位掩碼

位掩碼允許我們在一個(gè)數(shù)字變量中存儲多個(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變量中存儲所有關(guān)于用戶賬戶的信息。前八位(來自32個(gè)可用位)將存儲boolean信息,如 "該賬戶是否激活?"或 "該賬戶是否溢價(jià)?"

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

編碼

我們的用戶將有一個(gè)標(biāo)識符 "AAA",他將有一個(gè)活躍的高級賬戶(存儲在前兩個(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。最簡單的方法是對我們已有的掩碼進(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)閕nt總是有32位。然而,現(xiàn)在我們只對前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è)活躍的高級賬戶,所以他的變量的前兩個(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è)活躍的賬戶,但它不是高級賬戶,所以被屏蔽的值將只有第一個(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)制信息。


本文題目:提取信息,Java還有這個(gè)操作!你明白了嗎?
轉(zhuǎn)載注明:http://uogjgqi.cn/article/cojcisi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流