內存的位運算

示例:提取和設置標志位

假設我們有一個32位的整數,其中不同的位代表不同的標志。例如:

  • 位0:是否開啟日志(0表示關閉,1表示開啟)

  • 位1:是否啟用調試模式(0表示禁用,1表示啟用)

  • 位2-31:保留或用于其他目的

提取標志位

如果我們想要檢查是否啟用了調試模式(位1),可以使用以下代碼:

int flags = getStatusFlags(); // 假設這是一個獲取狀態標志的函數
bool isDebugModeEnabled = (flags & (1 << 1)) != 0;

這里的操作解釋如下:

  1. (1 << 1):將1左移1位,得到 00000010(二進制)。

  2. flags & (1 << 1):對 flags00000010 進行按位與運算,結果中只有位1會被保留,其他位都會被清零。

  3. != 0:檢查結果是否不為0,以確定是否啟用了調試模式。

設置標志位

如果我們想要啟用調試模式,可以使用以下代碼:

int flags = getStatusFlags(); // 獲取當前狀態標志
flags |= (1 << 1); // 啟用調試模式
setStatusFlags(flags); // 假設這是一個設置狀態標志的函數

這里的操作解釋如下:

  1. (1 << 1):將1左移1位,得到 00000010(二進制)。

  2. flags |= (1 << 1):對 flags00000010 進行按位或運算,結果中位1會被設置為1,其他位保持不變。

擴展:其他位運算的應用

1. 清除特定位

如果我們想要清除調試模式標志(位1),可以使用以下代碼:

int flags = getStatusFlags(); // 獲取當前狀態標志
flags &= ~(1 << 1); // 清除調試模式標志
setStatusFlags(flags); // 設置狀態標志

這里的操作解釋如下:

  1. ~(1 << 1):對 00000010 進行按位取反,得到 11111111 11111111 11111111 11111101(二進制)。

  2. flags &= ~(1 << 1):對 flags 和取反后的結果進行按位與運算,結果中位1會被清零,其他位保持不變。

2. 切換特定位

如果我們想要切換調試模式標志(位1),可以使用以下代碼:

int flags = getStatusFlags(); // 獲取當前狀態標志
flags ^= (1 << 1); // 切換調試模式標志
setStatusFlags(flags); // 設置狀態標志

這里的操作解釋如下:

  1. (1 << 1):將1左移1位,得到 00000010(二進制)。

  2. flags ^= (1 << 1):對 flags00000010 進行按位異或運算,結果中位1會被切換(如果原來是0則變為1,如果原來是1則變為0),其他位保持不變。

3. 檢查多個標志

如果我們想要同時檢查是否啟用了日志和調試模式,可以使用以下代碼:

int flags = getStatusFlags(); // 獲取當前狀態標志
bool isLogEnabled = (flags & (1 << 0)) != 0;
bool isDebugModeEnabled = (flags & (1 << 1)) != 0;

這里的操作解釋如下:

  1. (flags & (1 << 0)) != 0:檢查位0是否被設置,以確定是否啟用了日志。

  2. (flags & (1 << 1)) != 0:檢查位1是否被設置,以確定是否啟用了調試模式。

通過這些示例,我們可以看到位運算在處理標志位時的高效性和靈活性。它們可以直接在二進制級別上操作數據,避免了額外的計算或轉換步驟,非常適合在需要高效處理大量數據的場景中使用。

總之別被束縛:
像 int length = (0x11112222 >> 16) & 0FFFF; 它的結果就是length == 0x1111; 它的意思就是把高位16位二進制(高位的兩個字節)移動到低16位,進行與運算。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81944.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux -shell原理與運用

1---shell的工作方式和功能 shell的工作方式: shell本身也是一個應用程序,存儲在/bin 或者是/user/bin中 登錄的時候 會根據/etc/passwd文件載入shell默認執行 shell啟動后,就會顯示命令提示符,等待用戶輸入命令 命令的邏輯: 首先會判斷時內部命令還是外部命令,如果是內部…

js獲取uniapp獲取webview內容高度

js獲取uniapp獲取webview內容高度 在uni-app中&#xff0c;如果你想要獲取webview的內容高度&#xff0c;可以使用uni-app提供的bindload事件來監聽webview的加載&#xff0c;然后通過調用webview的invokeMethod方法來獲取內容的高度。 以下是一個示例代碼&#xff1a; <te…

Windows系統升級Nodejs版本

什么是nodejs Node.js 是一個免費、開源、跨平臺的 JavaScript 運行時環境, 它讓開發人員能夠創建服務器 Web 應用、命令行工具和腳本。 NodeJs官網 網址&#xff1a;Node.js — 在任何地方運行 JavaScript 可以通過網址下載安裝&#xff0c;通過官網可以看到現在最新版本為22…

Relay算子注冊(在pytorch.py端調用)

1. Relay算子注冊 (C層) (a) 算子屬性注冊 路徑: src/relay/op/nn/nn.cc RELAY_REGISTER_OP("hardswish").set_num_inputs(1).add_argument("data", "Tensor", "Input tensor.").set_support_level(3).add_type_rel("Identity…

【JavaEE】網絡原理之初識(1.0)

目錄 ?編輯 局域網與廣域網 IP地址和端口號 實現簡單的服務器客戶端交互 簡單理解socket TCP和UDP的差別&#xff08;初識&#xff09; socket面對udp DatagramSocket API DatagramSocket 構造方法 DatagramSocket 方法&#xff1a; DatagramPacket API Data…

Redis數據結構ZipList,QuickList,SkipList

目錄 1.ZipList 1.2.解析Entry&#xff1a; 1.3Encoding編碼 1.4.ZipList連鎖更新問題 2.QuickList SkipList跳表 RedisObject 五種數據類型 1.ZipList redis中的ZipList是一種緊湊的內存儲存結構&#xff0c;主要可以節省內存空間儲存小規模數據。是一種特殊的雙端鏈表…

laravel 12 監聽syslog消息,并將消息格式化后存入mongodb

在Laravel 12中實現監聽Syslog消息并格式化存儲到MongoDB&#xff0c;需結合日志通道配置、Syslog解析和MongoDB存儲操作。以下是具體實現方案&#xff1a; 一、環境配置 安裝MongoDB擴展包 執行以下命令安裝必要的依賴&#xff1a; composer require jenssegers/mongodb ^4.0確…

【STM32項目實戰】一文了解單片機的SPI驅動外設功能

前言&#xff1a;在前面我有文章介紹了關于單片機的SPI外設CUBEMX配置&#xff0c;但是要想使用好SPI這個外設我們還必須對其原理性的時序有一個詳細的了解&#xff0c;所以這篇文章就補充一下SPI比較偏向底層的時序性的邏輯。 1&#xff0c;SPI簡介 SPI是MCU最常見的對外通信…

【挖洞利器】GobyAwvs解放雙手

【滲透測試工具】解放雙手&Goby配合Awvs滲透測試利器\x0a通過Goby和Awvs 解放雙手https://mp.weixin.qq.com/s/SquRK8C5cRpWmfGbIOqxoQ

LangChain4j(15)——RAG高級之跳過檢索

之前的文章中&#xff0c;我們介紹了RAG的使用&#xff0c;但是&#xff0c;每次提問時&#xff0c;都會通過RAG進行檢索。有時&#xff0c;檢索是不必要執行的&#xff0c;比如&#xff0c;當用戶只是說“你好”時。于是&#xff0c;我們需要有條件的跳過檢索過程。 跳過決策…

【SDRS】面向多模態情感分析的情感感知解糾纏表征轉移

abstract 多模態情感分析(MSA)旨在利用多模態的互補信息對用戶生成的視頻進行情感理解。現有的方法主要集中在設計復雜的特征融合策略來整合單獨提取的多模態表示,忽略了與情感無關的信息的干擾。在本文中,我們提出將單模表征分解為情感特定特征和情感獨立特征,并將前者融…

Sui 上線兩周年,掀起增長「海嘯」

兩年前的 5 月 3 日&#xff0c;Sui 的主網正式發布&#xff0c;將在開發網和測試網上驗證過的下一代技術承諾變為現實。這一新興網絡旨在優化現有區塊鏈技術&#xff0c;結合高性能計算環境與安全性、可驗證性及韌性。 隨著 Sui 迎來兩周年&#xff0c;這股浪潮已成長為「海嘯…

深入理解 mapper-locations

mybatis-plus.mapper-locations: classpath*:/mapper/**/*.xml 是 MyBatis/MyBatis-Plus 在 Spring Boot 配置文件&#xff08;如 application.yml 或 application.properties&#xff09;中的一項關鍵配置&#xff0c;用于指定 MyBatis Mapper XML 文件的存放路徑。以下是詳細…

電容的作用

使用多個電容是從電容的實際等效模型去考慮的(也就是從SI&#xff0c;信號完整性方面&#xff09;。只考慮一個實際電容時&#xff0c;它的阻抗曲線是一個類似于倒三角形的形狀&#xff0c;只在諧振頻率點(與等效串聯電感形成)處的阻抗最小。因此相當于只在這一個頻率點處及附近…

移植的本質是什么

有斷時間我就在想&#xff0c;為什么freertos&#xff0c;lvgl等等的移植都是把庫文件放進來&#xff0c;直接點擊編譯&#xff0c;然后把bug都處理完成就移植成功了&#xff0c;為什么呢&#xff1f; 明明我一個函數都沒調用&#xff0c;為什么會有一堆錯誤&#xff0c;莫名其…

廣告場景下的檢索平臺技術

檢索方向概述 數據檢索領域技術選型大體分為SQL事務數據庫、NoSQL數據庫、分析型數據庫三個類型。 SQL數據庫的設計思路是采用關系模型組織數據&#xff0c;注重讀寫操作的一致性&#xff0c;注重數據的絕對安全。為了實現這一思路&#xff0c;SQL數據庫往往會犧牲部分性能&…

高頻PCB設計如何選擇PCB層數?

以四層板為例&#xff0c;可以第一層和第二層畫信號&#xff0c;作為信號層。 第三層可以走電源&#xff0c;然后第四層走GND 但是更可以第一層和第三層畫信號。第二層可以走電源&#xff0c;然后第四層走GND 用中間的電源層以及地層可以起到屏蔽的作用&#xff0c;有效降低寄…

[Linux_69] 數據鏈路層 | Mac幀格式 | 局域網轉發 | MTU MSS

目錄 0.引入 1.以太網幀格式 2.重談局域網轉發的原理(基于協議) 小結 3.認識MTU 3.1MTU對IP協議的影響 3.2MTU對UDP協議的影響 3.3MTU對于TCP協議的影響 0.引入 在去年的這篇文章中&#xff0c;我們有對網絡進行過一個概述[Linux#47][網絡] 網絡協議 | TCP/IP模型 | 以…

vue2 provide 后 inject 數據不是響應式的,不實時更新

今天用 provide 后&#xff0c;inject 獲取數據時不是實時更新的&#xff0c;獲取的不是更新后的值 祖父組件 <div style"text-align: left !important;"><button click"change">更改</button> </div>data() {return {name: ini…

洛谷---P1629 郵遞員送信

題目描述 有一個郵遞員要送東西&#xff0c;郵局在節點 1。他總共要送 n?1 樣東西&#xff0c;其目的地分別是節點 2 到節點 n。由于這個城市的交通比較繁忙&#xff0c;因此所有的道路都是單行的&#xff0c;共有 m 條道路。這個郵遞員每次只能帶一樣東西&#xff0c;并且運…