詳解位運算(、|、^、^、>>、<<)

十六進制與二進制對應關系

十六進制和二進制之間的轉換非常直接,每個十六進制數字直接對應四個二進制位,并且十六進制相對二進制要更加簡潔,因此通常書寫位操作的代碼時會選擇使用十六進制來表示數值。

為了方便快速閱讀涉及位運算的源碼,我們首先需要了解十六進制的 16 個數字和二進制的對應關系,對應關系如下:

  • 0對應0000
  • 1對應0001
  • 2對應0010
  • 3對應0011
  • 4對應0100
  • 5對應0101
  • 6對應0110
  • 7對應0111
  • 8對應1000
  • 9對應1001
  • A對應1010
  • B對應1011
  • C對應1100
  • D對應1101
  • E對應1110
  • F對應1111

&

& 按位與(AND)操作。對于每一位,只有兩個操作數相對應的位都是1時,結果位才為1,否則為0。

示例:0x1234 & 0x4321 = 0x0220

計算思路:

16進制各位依次轉換為二進制,進行二進制對應位計算。

計算演示(從高位到低位):

1: 0001
4: 0100
0000: 0

2: 0010
3: 0011
0010: 2

3: 0011
2: 0010
0010: 2

4: 0100
1: 0001: 0

res: 0x0220

使用 uint16 僅是因為當前示例為 uint16

| 按位或(OR)操作。對于每一位,如果兩個操作數相應的位中至少有一個為1,則結果位為1,否則為0。

示例:0x1234 | 0x4321 = 0x5335

計算思路同 &,簡略計算步驟如下:

  1. 0x1234 轉二進制:0001 0010 0011 0100
  2. 0x4321 轉二進制:0100 0011 0010 0001
  3. 對每一位執行或操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0101 0011 0011 0101
    res: 0x5335

^

^ 異或操作(XOR)操作。對于每一位,如果兩個操作數對應的位一個為0一個為1,則結果位位1,否則為0。

示例:0x1234 ^ 0x4321 = 0x5115

  1. 0x1234 轉二進制:0001 0010 0011 0100
  2. 0x4321 轉二進制:0100 0011 0010 0001
  3. 對每一位執行異或操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0101 0001 0001 0101
    res: 0x5335

&^

&^ 位清除(AND NOT)操作。對于每一位,如果第二操作數相應的位為1,則結果位為0,否則結果位為第一個操作數相應的位。

示例:0x1234 ^ 0x4321 = 0x1014

  1. 0x1234 轉二進制:0001 0010 0011 0100
  2. 0x4321 轉二進制:0100 0011 0010 0001
  3. 對每一位執行操作:
    0001 0010 0011 0100
    0100 0011 0010 0001
    -------------------
    0001 0000 0001 0101
    res: 0x1014

<<

<< 左移操作。將操作數的所有位向左移動指定的位數,右邊空出的位用0填充。

示例:0xFFFF << 1 = 0xFFFE

  1. 0xFFFF 轉二進制:1111 1111 1111 1111
  2. 所有位左移1位,并在末位填充0:
    1111 1111 1111 1110
    res: 0xFFFE

>>

>> 右移操作。將操作數的所有位向右移動指定的位數,左邊空出的位的填充方式取決于操作數的類型(對于無符號數用0填充,對于有符號數,通常用符號位填充,但這可能依賴于具體實現)。

無符號整數示例

0xF0 >> 2 = 0x3C

  1. 0xF0 轉二進制:1111 0000
  2. 所有位右移2位:
    1111 0000
    0011 1100
    res: 0x3C

有符號整數示例

對有符號整數求右移我們需要首先知道補碼的計算方式

計算補碼

-16 為例:

  1. 使用二進制表示正160001 0000
  2. 取反(0變1,1變0):1110 1111
  3. 加1:1111 0000
右移

-16 >> 2 = -4

有符號整數:-16(十進制),補碼形式為 1111 0000

計算思路:將補碼所有位右移2位,高位補符號位(此處為1),得到結果也是補碼。

初始:1111 0000,右移2位:1111 1100

反推十進制整數

將補碼 1111 1100 轉換為十進制需要:

  1. 取反:0000 0011
  2. 加1得到:0000 0100
  3. 轉換為十進制:0000 0100 轉為十進制為 4
  4. 加上符號:-4

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

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

相關文章

深入探索Scala的類型推斷機制

引言 Scala是一種靜態類型編程語言&#xff0c;以其強大的類型推斷系統而聞名。類型推斷允許開發者在很多情況下省略顯式的類型聲明&#xff0c;從而編寫更簡潔、更少出錯的代碼。本文將深入探討Scala的類型推斷是如何實現的&#xff0c;以及它如何幫助提高開發效率和代碼可讀…

萌啦跨境工具箱有什么作用,萌啦跨境工具箱OZON營銷神器

萌啦OZON數據平臺&#xff0c;作為專為OZON平臺商家打造的數據分析工具&#xff0c;集成了多種強大功能&#xff0c;旨在幫助商家在激烈的市場競爭中獲得數據驅動的優勢&#xff0c;實現精準運營與高效增長。那么萌啦跨境工具箱有什么作用&#xff1f;接下來介紹萌啦跨境工具箱…

全面升級廚房安全,電焰灶引領新時代

煤氣是許多家庭日常使用的能源&#xff0c;目前的普及率還是比較高的&#xff0c;但平時因煤氣泄漏而引發的事故也很多&#xff0c;只需要查看最近一個月因液化氣泄漏引起的爆炸事件屢見不鮮。打開新聞&#xff0c;我們總能時不時看到煤氣爆炸的事故&#xff0c;幸運的能夠逢兇…

代碼隨想錄算法訓練營day70 | 108. 冗余連接、109. 冗余連接II

本次題目都來自卡碼網 108. 冗余連接 無向圖&#xff0c;返回一條可以刪去的邊&#xff0c;使得結果圖是一個有著N個節點的樹&#xff08;即&#xff1a;只有一個根節點&#xff09;。 從前向后遍歷每一條邊&#xff08;因為優先讓前面的邊連上&#xff09;&#xff0c;邊的…

【2024LLM應用-數據預處理】之如何從PDF,PPT等非結構化數據提取有效信息(結構化數據JSON)?

&#x1f970;大家知道嗎,之前在給AI大模型"喂數據"的時候,我們往往需要把非結構化數據(比如PDF、PPT、Excel等)自己手動轉成結構化的格式,這可真是太累人兒了。&#x1f975; 幸好現在有了Unstructured這個神級庫,它內置的數據提取函數可以幫我們快速高效地完成這個…

ubuntu 安裝并啟用 samba

環境&#xff1a;ubuntu server 24.04 步驟如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增內容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

[Information Sciences 2023]用于假新聞檢測的相似性感知多模態提示學習

推薦的一個視頻&#xff1a;p-tuning P-tunning直接使用連續空間搜索 做法就是直接將在自然語言中存在的詞直接替換成可以直接訓練的輸入向量。本身的Pretrained LLMs 可以Fine-Tuning也可以不做。 這篇論文也解釋了為什么很少在其他領域結合知識圖譜的原因&#xff1a;就是因…

什么是客戶體驗自動化?

客戶體驗自動化是近年來在企業界備受關注的一個概念。那么&#xff0c;究竟什么是客戶體驗自動化呢&#xff1f;本文將為您詳細解析這一話題&#xff0c;幫助您更好地理解并應用客戶體驗自動化。 我們要先明確什么是客戶體驗。客戶體驗是指客戶在使用產品或服務過程中的感受和體…

Android SQLite 數據庫存學習與總結

Android 系統內置了一個名為 SQLite 數據庫。那么 SQLite 是一種什么樣的數據庫&#xff0c;它有那些特點&#xff0c;應該怎么操作它&#xff1f;下面&#xff0c;讓我們就來認識一下它吧。 1、概念&#xff1a; SQLite 是一種輕量級的關系型數據庫&#xff0c;它不僅支持標準…

elementPlus自定義el-select下拉樣式

如何在f12元素選擇器上找到下拉div呢&#xff1f; 給el-select添加 :popper-append-to-body"false" 即可&#xff0c;這樣就可以將下拉框添加到body元素中去&#xff0c;否則當我們失去焦點&#xff0c;下拉就消失了&#xff0c;在元素中找不到el-select。剩下就可以…

洛谷 AT_abc169_d [ABC169D] Div Game 題解

思路 想要讓操作次數最多&#xff0c; z z z 就要盡可能小。 由于 z z z 是 N N N 的因數&#xff0c;所以 p p p 就是 N N N 的質因數。 設 N N N 的質因數中有 x x x 個 p p p&#xff0c;則這個 p p p 能執行 y y y 此操作&#xff0c;并且 y y y 滿足 ∑ i …

怎么壓縮圖片大小?6種無需犧牲質量的圖片壓縮方法

經常處理圖片的小伙伴都知道&#xff0c;高質量的圖片往往會占據電腦大量的存儲空間&#xff0c;導致圖片傳輸及存儲的不便。因此&#xff0c;掌握如何壓縮圖片大小變得尤為重要。本文將詳細介紹圖片壓縮的幾種方法&#xff0c;幫助你高效地減小圖片文件大小&#xff0c;讓你的…

使用多智能體辯論微調大型語言模型

F INE - TUNING L ARGE L ANGUAGE M ODELS WITH MULTI - AGENT D EBATE S UPERVISION DebateGPT: Fine-tuning Large Language M

探究Yarn依賴之源:精通why命令的秘籍

&#x1f575;??♂? 探究Yarn依賴之源&#xff1a;精通why命令的秘籍 在現代JavaScript項目開發中&#xff0c;依賴管理是至關重要的一環。Yarn作為領先的包管理器之一&#xff0c;提供了強大的工具來幫助開發者理解項目依賴的起源和結構。yarn why命令就是這樣一個工具&am…

IT專業入門,高考假期預習指南-致有志踏入IT領域的高考少年們

IT專業入門&#xff0c;高考假期預習指南 七月來臨&#xff0c;各省高考分數已揭榜完成。而高考的完結并不意味著學習的結束&#xff0c;而是新旅程的開始。對于有志于踏入IT領域的高考少年們&#xff0c;這個假期是開啟探索IT世界的絕佳時機。 計算機專業是一個綜合性非常強…

【.Net】Web項目部署騰訊云

文章目錄 總述前置準備docker-compose部署普通部署 參考 總述 前置準備 云服務添加端口 另有linux本身防火墻請參考&#xff1a; 【Linux】防火墻命令 需安裝.Net SDK和Asp .Net Runtime 注意&#xff1a; 1、sdk也要不只是runtime 2、是Asp .Net Runtime不是.Net Runtime …

ConcurrentHashMap并發哈希表的設計與實現

ConcurrentHashMap并發哈希表的設計與實現 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 介紹ConcurrentHashMap 1. ConcurrentHashMap的概述 ConcurrentH…

一個計算密集小程序在不同CPU下的表現

本文比較了幾款CPU對同一測試程序的比較結果&#xff0c;用的是Oracle公有云OCI上的計算實例&#xff0c;均分配的1 OCPU&#xff0c;內存用的默認值&#xff0c;不過內存對此測試程序運行結果不重要。 本文只列結果&#xff0c;不做任何評價。下表中&#xff0c;最后一列為測…

搜索型數據庫的技術發展歷程與趨勢前瞻

概述 隨著數字科技的飛速發展和信息量的爆炸性增長&#xff0c;搜索引擎已成為我們獲取信息的首選途徑之一&#xff0c;典型的代表廠商如 Google。然而&#xff0c;隨著用戶需求的不斷演變&#xff0c;傳統的搜索技術已經無法滿足人們對信息的實時性、個性化和多樣性的需求。 …

Qt應用程序中通過上下左右鍵選擇控件,像win桌面圖標選擇一樣

在Qt應用程序中模擬Windows桌面圖標的選擇行為&#xff0c;即通過上下左右鍵來移動選擇控件&#xff0c;你需要管理一個焦點系統&#xff0c;該系統能夠跟蹤哪個控件當前被選中&#xff0c;并根據用戶的鍵盤輸入來更新這個狀態。以下是一個簡化的步驟說明和示例代碼&#xff0c…