色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用位操作符實現低級別的位掩碼

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-07 16:52 ? 次閱讀

在本文中,我們來看看如何使用位操作符實現低級別的位掩碼。我們將看到我們如何將一個單一的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

任意位置的位

如果我們想檢查其他的位,我們需要創(chuàng)建一個適當的掩碼,這個掩碼需要在給定的位置上有一個位設置為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變量向相反方向移動,而不是改變掩碼。

提取多個比特

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

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

我們仍然有32位,因為int總是有32位。然而,現在我們只對前24位感興趣,其余的都是零,會很容易被忽略。我們創(chuàng)建的int變量可以很容易地用作整數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();

應用一個比特掩碼

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

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

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

總結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7223

    瀏覽量

    90172
  • 二進制
    +關注

    關注

    2

    文章

    802

    瀏覽量

    41869
  • 內存
    +關注

    關注

    8

    文章

    3081

    瀏覽量

    74595
  • 運算符
    +關注

    關注

    0

    文章

    172

    瀏覽量

    11176
收藏 人收藏

    評論

    相關推薦

    Linux命令中“!”操作符的用法

    Linux中的'!'符號或操作符可以用作邏輯否定運算,也可以用于在歷史記錄中獲取命令并進行修改或運行以前執(zhí)行過的命令。
    發(fā)表于 07-05 10:07 ?1546次閱讀

    MATLAB操作符和特殊字符

    MATLAB操作符和特殊字符* 矩陣乘法 .* 數組乘法 ^ 矩陣冪 .^ 數組冪 \ 左除或反斜杠 / 右除或斜杠 ./ 數組除 Kron Kronecker張量積 .. 父目錄 … 繼續(xù)
    發(fā)表于 09-22 16:05

    C語言,操作符優(yōu)先級順序。

    ;、==、!=) 〉邏輯運算(特別要說明,按與、或的優(yōu)先級高于邏輯與、或),接下來就是三目運算?=然后是賦值操作符等號,最后是逗號,。運算
    發(fā)表于 01-16 17:30

    操作符的相關資料分享

    嵌入式C語言入門——操作符
    發(fā)表于 12-15 06:50

    操作C語言支持的幾種操作符是哪些呢

    一、操作C語言支持的6種操作符如下:1.不改變其他的值的狀況下,對某幾個位進行設值。方法:先對需要設置的
    發(fā)表于 12-22 08:07

    操作符及其常用方式簡要概述

    目錄前言一、操作符及其常用方式二、實例應用解析(嵌入式筆試??迹┣把?b class='flag-5'>位操作在單片機的C語言開發(fā)中經常會用到,該操作主要用于讀寫寄存器,這篇
    發(fā)表于 02-17 06:33

    C語言編程二進制操作符

    C語言編程二進制操作符
    發(fā)表于 03-30 14:09 ?6次下載

    使用51單片機內核的匯編操作符筆記

    本文檔的主要內容詳細介紹的是使用51單片機內核的匯編操作符筆記。
    發(fā)表于 07-19 17:38 ?1次下載
    使用51單片機內核的匯編<b class='flag-5'>操作符</b>筆記

    C++:詳談取地址操作符重載

    取址操作符重載函數返回值為該類型的指針,無參數。
    的頭像 發(fā)表于 06-29 11:59 ?3545次閱讀
    C++:詳談取地址<b class='flag-5'>操作符</b>重載

    C++之操作重載學習的總結(二)

    復數的概念可以通過自定義類實現;復數中的運算操作可以通過操作符重載實現;賦值操作符只能通過成員函數實現
    的頭像 發(fā)表于 12-24 16:26 ?667次閱讀

    C++之操作符重載學習的總結

    操作符重載是c++的強大特性之一;操作符重載的本質是通過函數擴展操作符的功能;operator 關鍵字是實現操作符重載的關鍵。
    的頭像 發(fā)表于 12-24 16:36 ?741次閱讀

    C語言操作

    目錄前言一、操作符及其常用方式二、實例應用解析(嵌入式筆試常考)前言 操作在單片機的C語言開發(fā)中經常會用到,該操作主要用于讀寫寄存器,
    發(fā)表于 12-22 19:09 ?12次下載
    C語言<b class='flag-5'>位</b><b class='flag-5'>操作</b>

    Verilog基礎:幾個常用的按操作符

    操作符是對二進制進行操作的運算。
    的頭像 發(fā)表于 11-09 10:57 ?1510次閱讀

    Verilog基礎:介紹幾個常用的按操作符

    操作符是對二進制進行操作的運算。以下是一些常用的操作
    的頭像 發(fā)表于 11-09 10:59 ?2045次閱讀

    “+”操作符的使用技巧

    這篇寫個平時易被忽略的小知識點,一元 + 操作符的使用技巧。
    的頭像 發(fā)表于 12-28 13:27 ?693次閱讀
    主站蜘蛛池模板: 国产精品乱码色情一区二区视频 | 国内视频在线精品一区 | writeas雷狮直播 | 色久久一个亚洲综合网 | 韩国hd高清xxx | 色欲精品国产AV久久久 | 久久久久久久久性潮 | 大岛优香久久中文字幕 | 我要干av | 无套内射无矿码免费看黄 | 成年女人免费播放影院 | 九九精品久久 | 16女下面流水不遮图免费观看 | 99在线精品免费视频 | 久久亚洲精品中文字幕 | 亚洲视频欧美视频 | 国产成人久久婷婷精品流白浆 | 亚洲色欲色欲WWW在线成人网 | 国产黄大片在线视频 | 最近中文字幕在线看免费完整版 | 国产免费毛片在线观看 | 国产午夜永久福利视频在线观看 | 国产中文字幕免费观看 | 免费精品国产人妻国语 | 色百度网址大全 | 久久中文字幕免费视频 | 中俄两军在日本海等上空战略巡航 | 国产又湿又黄又硬又刺激视频 | 最近2018年手机中文字幕 | 中文字幕乱偷无码AV蜜桃 | 亚洲看片无码免费视频 | 国产乱色伦影片在线观看 | 亚洲中文字幕日产乱码2020 | 久久免费精品国产72精品剧情 | 精品一区二区三区在线成人 | 影音先锋av男人资源 | 免费的好黄的漫画 | 久久久精品久久久久特色影视 | 国产精品久久久久影院色老大 | 国产久爱青草视频在线观看 | 91嫩草视频在线观看 |