成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

大家好,我是指北君。

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

位掩碼

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

因為一個比特可以等于 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);

總結

在本教程中,我們學習了如何使用位運算符來創建位掩碼,并應用它們來從整數中提取二進制信息。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2023-10-30 08:16:33

數據庫插件Mybatis

2021-10-28 16:50:23

OCRNLP開源

2022-12-30 08:35:00

2023-12-28 08:43:28

前端算法搜索

2022-04-07 11:15:22

PulseEventAPI函數

2022-10-19 08:19:32

動態基線預警

2024-01-08 20:05:32

2022-03-21 08:55:53

RocketMQ客戶端過濾機制

2022-07-26 01:00:12

Eureka延遲注冊

2023-12-08 08:38:15

EventLoopAPI瀏覽器

2022-10-10 18:38:56

inert屬性鍵盤

2015-09-18 09:17:06

數據分析

2023-01-02 23:58:03

2022-10-08 08:09:13

MGRGreatSQL事務

2022-03-05 17:56:29

桌面應用開發

2023-12-06 08:01:03

CSSPostCSS

2022-10-24 20:25:40

云原生SpringJava

2023-06-14 08:15:34

算法合并操作Winner

2024-03-27 13:33:00

MySQLInnoDB事務

2023-03-03 16:38:28

JavaSpring框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲自拍偷拍视频 | 黄色大片免费网站 | 五月天激情综合网 | 一二三四av| 久久精品网 | 美国av毛片 | 精品www| 中文字幕在线人 | 一区二区三区精品在线 | 午夜电影合集 | 国产高清精品在线 | 日韩不卡一区二区 | av中文字幕网 | 毛片免费视频 | 亚洲精品综合一区二区 | 亚洲激情一级片 | 亚洲+变态+欧美+另类+精品 | 国产精品色| 色婷婷国产精品综合在线观看 | 欧美日日 | 欧美精品久久 | 久久精品国产亚洲夜色av网站 | 欧美一区二区三区高清视频 | 久久久久综合 | 欧美男人天堂 | 免费精品在线视频 | 亚洲人成在线播放 | 久久久网 | 99亚洲精品 | 美女三区 | 综合中文字幕 | 成人三级视频在线观看 | 一区二区中文 | 久久亚洲欧美日韩精品专区 | 精品视频在线一区 | 国产一区二区三区免费观看视频 | 国产精品a久久久久 | 五月综合激情在线 | 9久久婷婷国产综合精品性色 | 精品电影 | 国产一区二区三区视频免费观看 |