卧槽,提取信息,Java還有這個騷操作

2022年10月23日09:59:12 科技 1123

在本文中,我們來看看如何使用位操作符實現低級別的位掩碼。我們將看到我們如何將一個單一的int變量作為一個單獨的數據容器。

卧槽,提取信息,Java還有這個騷操作 - 天天要聞

位掩碼

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

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

舉個例子

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

至於剩下的24位,我們將把它們轉換成三個字符,作為用戶的標識符。

編碼

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

String stringRepresentation = "01000001010000010100000100000011";

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

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

解碼

這個過程也可以用 Integer#toBinaryString 方法來反轉。

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

提取一個比特

第一比特

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

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

然後我們需要檢查產生的值是否不等於零。

intRepresentation & 1 != 0

任意位置的位

如果我們想檢查其他的位,我們需要創建一個適當的掩碼,這個掩碼需要在給定的位置上有一個位設置為1,其餘的設置為0。最簡單的方法是對我們已有的掩碼進行移位。

1 << (position - 1)

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

00000000000000000000000000000100

因此,現在,比特方程將看起來像這樣。

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

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

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

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

提取多個比特

我們可以用類似的方法從一個整數中提取多個比特。讓我們提取我們的用戶帳戶變量的最後三個位元組,並將其轉換為一個字符串。首先,我們需要通過將變量向右移動來擺脫前八位的影響。

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

我們仍然有32位,因為int總是有32位。然而,現在我們只對前24位感興趣,其餘的都是零,會很容易被忽略。我們創建的int變量可以很容易地用作整數ID,但是因為我們想有一個字符串ID,所以我們還有一個步驟要做。

我們將把二進制的字符串表示法分成8個字符的組,把它們解析成char變量,然後把它們連接成一個最終的String

為了方便起見,我們還將忽略空位元組。

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();

應用一個比特掩碼

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

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

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

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

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

現在,我們可以輕鬆而廉價地斷言一個用戶是否符合我們的條件。

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

總結

在本教程中,我們學習了如何使用位運算符來創建位掩碼,並應用它

科技分類資訊推薦

如何讓區塊鏈技術更好賦能實體經濟 - 天天要聞

如何讓區塊鏈技術更好賦能實體經濟

區塊鏈是數據共享和價值流通的重要基礎設施,是下一代價值互聯網絡的核心技術。隨着區塊鏈技術在多場景積極落地,釋放出顯著的市場價值。實踐證明,區塊鏈只有深深紮根在具體應用場景中,才能夠真正發揮出重要作用。在「十五五」期間,要更好推動區塊鏈技術賦能實體經濟,加快與場景融合發展。堅持系統性思維一方面,要用整...
通訊|中企助力尼日利亞水電樞紐重獲新生 - 天天要聞

通訊|中企助力尼日利亞水電樞紐重獲新生

新華社阿布賈6月10日電 通訊|中企助力尼日利亞水電樞紐重獲新生 新華社記者楊喆 朱悅 在尼日利亞中北部尼日爾州新布薩以東約17公里,非洲第三長河尼日爾河流經卡因吉大壩,發出轟隆隆巨響,向下游傾瀉而去。 這是2025年6月1日在尼日利亞尼日爾州拍攝的卡因吉水電站內的水電機組。新華社發(中國電建華東院公司供圖) 坐落...
成都將上線預付式消費綜合服務平台,這些行業和區域被納入試點 - 天天要聞

成都將上線預付式消費綜合服務平台,這些行業和區域被納入試點

在日常生活中,預付式消費是一種常見的消費模式,例如美容美髮卡、健身卡、培訓課程預付費等。但是一些商家或機構的「跑路」事件,讓行業發展面臨信任危機,如何破解這一發展困境?6月13日,一場聚焦預付式消費健康發展的政企交流會,在成都市民營經濟發展促進中心舉辦。本次活動主題為「惠企政策直達·預付生態共建」,主...
永久封禁!微信、快手連發公告 - 天天要聞

永久封禁!微信、快手連發公告

日前微信、快手宣布下架部分違規微短劇劇目對違規劇集相關發佈賬號永久封禁9日,微信珊瑚安全發佈的《關於違規微短劇類小程序的處置公告(2025年6月)》指出:近期,平台通過巡查審核發現,部分微短劇存在不良價值觀導向內容或存在侵權等行為。
生產過1億台ThinkPad的工廠長什麼樣?京東采銷618直播揭秘其品質密碼 - 天天要聞

生產過1億台ThinkPad的工廠長什麼樣?京東采銷618直播揭秘其品質密碼

京東618火熱進行中,持續帶給消費者更多驚喜。6月12日,京東筆記本采銷團隊攜手知名硬件評測人「豬王」深入聯想ThinkPad生產基地,全景呈現ThinkPad嚴苛的生產流程,更通過跌落測試等直觀實驗,驗證了其軍工級品質的可靠性。此外,京東筆記本采銷團隊為消費者帶來多款熱門產品的直播專享福利,更有十萬紅包雨發放,打造又好...
Bitget 向敘利亞用戶敞開大門,提供全方位服務產品套件 - 天天要聞

Bitget 向敘利亞用戶敞開大門,提供全方位服務產品套件

維多利亞,塞舌爾, June 13, 2025 (GLOBE NEWSWIRE) -- 領先的加密貨幣交易所和 Web3 公司 Bitget 現已為敘利亞公民提供該平台。 這在近期 OFAC 制裁暫停之後進行。 敘利亞公民和居民現在可以在該平台上註冊、完成身份驗證並獲得全套服務,包括 P2P、現貨交易、期貨和獲取收益的產品。 對於一個長期面臨衝突、經濟孤立和