大/小端模式與位操作

文章目錄

1.?大小端模式

2.?大端模式(Big-endian)

3. 小端模式(Little Endian)

4. 判斷和轉換大小端模式

5.?位操作

5.1?移位操作

5.2?取反操作

5.3?位與操作

5.4?位或操作

5.5?置位操作

5.6?清位操作


1.?大小端模式

大小端模式(Endianness)是指計算機系統中多字節數據的存儲方式。不同的計算機系統可能采用不同的大小端模式來存儲數據,這會影響到數據在內存中的排列順序。

大小端模式的影響

  1. 數據交換: 在不同大小端模式的系統之間交換數據時,數據的解釋方式會有所不同。如果不進行適當的轉換,可能導致數據的錯誤解讀。例如,一個32位整數在大端系統中為0x12345678,在小端系統中可能被解釋為0x78563412。

  2. 文件格式: 某些文件格式在設計時會指定采用某種字節序。例如,網絡協議通常使用大端模式,也稱為"網絡字節序"(Network Byte Order)。在解析這些文件或網絡數據時,需要注意字節序的轉換。

  3. 嵌入式系統: 在嵌入式系統開發中,嵌入式設備可能使用不同的處理器架構,不同架構可能采用不同的字節序。在與外設進行數據通信時,必須確保雙方使用一致的字節序。

2.?大端模式(Big-endian)

大端模式是指數據的高字節存儲在內存的低地址中,而數據的低字節存儲在內存的高地址中。這種存儲方式符合我們書寫數字的習慣,即從高位到低位,從左到右存儲。

例如,對于32位整數0x12345678:

  • 高字節(0x12)存儲在低地址處
  • 低字節(0x78)存儲在高地址處
地址數據
0x10000x12
0x10010x34
0x10020x56
0x10030x78

?

3. 小端模式(Little Endian)

小端模式是指數據的高字節存儲在內存的高地址中,而數據的低字節存儲在內存的低地址中。這種存儲方式與大端模式相反。

例如,對于32位整數0x12345678:

  • 低字節(0x78)存儲在低地址處
  • 高字節(0x12)存儲在高地址處
地址數據
0x10000x78
0x10010x56
0x10020x34
0x10030x12

4. 判斷和轉換大小端模式

可以通過C語言代碼來判斷當前系統的大小端模式:

這段代碼通過檢查整數的最低字節是否存儲在最低地址來判斷系統的字節序。

#include <stdio.h>int main() {unsigned int x = 0x12345678;char *c = (char*)&x;if (*c == 0x78) {printf("Little Endian\n");} else {printf("Big Endian\n");}return 0;
}

大小端模式轉換

如果需要在大小端模式之間進行轉換,可以使用如下方法:

這段代碼實現了32位整數的字節順序交換,可以用于大小端模式的轉換。

#include <stdio.h>
#include <stdint.h>// 交換字節順序
uint32_t swap_endian(uint32_t val) {return ((val >> 24) & 0xff) |      // 移動最高字節到最低字節((val << 8) & 0xff0000) |   // 移動次高字節到次低字節((val >> 8) & 0xff00) |     // 移動次低字節到次高字節((val << 24) & 0xff000000); // 移動最低字節到最高字節
}int main() {uint32_t original = 0x12345678;uint32_t swapped = swap_endian(original);printf("Original: 0x%x\n", original);printf("Swapped: 0x%x\n", swapped);return 0;
}

5.?位操作

位操作是計算機中對二進制位進行直接操作的技術。在編程中,位操作能夠高效地處理數據,通過操作特定位的值來實現一些特定的功能。位操作符直接對整數的二進制表示進行操作,因此通常比其他操作符快。

5.1?移位操作

移位操作通過移動一個數的二進制表示來實現乘法、除法、數據的快速處理等功能。移位操作分為左移和右移兩種,分別用左移操作符(<<)和右移操作符(>>)表示。

示例代碼

int a = 0x6; // 二進制是 0b0110
int b = a << 1; //左移操作
int c = a >> 1; //右移操作

左移操作符 << 將操作數的二進制表示向左移動指定的位數,右邊補0。

  • a 的二進制表示: 0110
  • 左移一位:01101100
  • 轉換為十六進制:11000xC

所以,b 的值為 0xC

右移操作符 >> 將操作數的二進制表示向右移動指定的位數,對于有符號整數,左邊根據符號位補0或1,對于無符號整數,左邊補0。

  • a 的二進制表示: 0110
  • 右移一位:01100011
  • 轉換為十六進制:00110x3

所以,c 的值為 0x3

5.2?取反操作

取反操作是一種位操作,用來將一個數的二進制表示中的每一位取反,即把 0 變成 1,把 1 變成 0。在C語言中,取反操作使用 ~ 符號。

示例代碼

int a = 0x6; // 二進制是 0b0110
int b = ~a;

取反操作符 ~ 將操作數的二進制表示中的每一位取反。

  • a 的二進制表示: 0110
  • 取反后:01101001
  • 轉換為十六進制:10010x9

所以,b 的值為 0x9

5.3?位與操作

位與操作是一種位操作,用來將兩個數的二進制表示中對應位置的位進行與運算。只有對應的兩個二進制位都為 1 時,結果位才為 1,否則結果位為 0。在 C 語言中,位與操作使用 & 符號。

示例代碼

int a = 0x6; // 二進制是 0b0110
int b = 0x7; // 二進制是 0b0111
int c = a & b;

位與操作符 & 將操作數的二進制表示中的每一位進行與運算。

  • a 的二進制表示: 0110
  • b 的二進制表示: 0111
  • 位與結果: 0110

運算如下:

  • 第1位:0 & 0 = 0
  • 第2位:1 & 1 = 1
  • 第3位:1 & 1 = 1
  • 第4位:0 & 1 = 0

所以,結果 c 的值為 0x6(十六進制),即 0b0110

5.4?位或操作

位或操作是一種位操作,用來將兩個數的二進制表示中對應位置的位進行或運算。只要對應的兩個二進制位中有一個為 1,結果位就為 1,否則結果位為 0。在 C 語言中,位或操作使用 | 符號。

int a = 0x6; // 二進制是 0b0110
int b = 0x7; // 二進制是 0b0111
int c = a | b;

位或操作符 | 將操作數的二進制表示中的每一位進行或運算。

  • a 的二進制表示: 0110
  • b 的二進制表示: 0111
  • 位或結果: 0111

運算如下:

  • 第1位:0 | 0 = 0
  • 第2位:1 | 1 = 1
  • 第3位:1 | 1 = 1
  • 第4位:0 | 1 = 1

所以,結果 c 的值為 0x7(十六進制),即 0b0111

5.5?置位操作

置位操作是一種常見的位操作,用來將某個變量的特定位設置為 1。在 C 語言中,可以使用位或運算符 | 和左移操作符 << 來實現置位操作。

int a = 0x6;  // 二進制是 0b0110
int a |= (1<<3);

這行代碼使用了位或運算符 | 和左移操作符 << 來實現置位操作。

  • 1<<3:將 1 左移 3 位,結果是 0b1000(二進制),即十六進制的 0x8
  • a |= 0b1000:將 a0b1000 進行位或運算。

計算過程:

  • a 的二進制表示: 0110
  • 1<<3 的二進制表示: 1000
  • 位或結果: 1110

運算如下:

  • 第1位:0 | 0 = 0
  • 第2位:1 | 0 = 1
  • 第3位:1 | 0 = 1
  • 第4位:0 | 1 = 1

所以,結果 a 的值為 0xE(十六進制),即 0b1110

5.6?清位操作

清位操作是將某個變量的特定位清零的一種操作。通過使用位與運算符 & 和按位取反操作符 ~ 可以實現清位操作。

int a = 0x6;  // 二進制是 0b0110
int a &= ~(1<<2);

這行代碼使用了位與運算符 & 和按位取反操作符 ~ 來實現清位操作。

  • 1<<2:將 1 左移 2 位,結果是 0b0100(二進制),即十六進制的 0x4
  • ~(1<<2):對 0b0100 進行按位取反,結果是 0b1011
  • a &= 0b1011:將 a0b1011 進行位與運算。

計算過程:

  • a 的二進制表示: 0110
  • ~(1<<2) 的二進制表示: 1011
  • 位與結果: 0010

運算如下:

  • 第1位:0 & 1 = 0
  • 第2位:1 & 0 = 0
  • 第3位:1 & 1 = 1
  • 第4位:0 & 1 = 0

所以,結果 a 的值為 0x2(十六進制),即 0b0010

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

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

相關文章

大數據學習之 scala基礎(補充)

scala基礎&#xff1a; hello world: 寫scala可運行文件的注意事項1、如果一個scala文件要運行&#xff0c;class要改成object2、如果是class&#xff0c;就僅單純代表一個類&#xff0c;如果是object代表的是單例對象3、scala語法中&#xff0c;一句話結束不需要加分號4、sca…

Spring的AOP基礎以及AOP的核心概念

2. AOP基礎 學習完spring的事務管理之后&#xff0c;接下來我們進入到AOP的學習。 AOP也是spring框架的第二大核心&#xff0c;我們先來學習AOP的基礎。 在AOP基礎這個階段&#xff0c;我們首先介紹一下什么是AOP&#xff0c;再通過一個快速入門程序&#xff0c;讓大家快速體…

Ubuntu配置GitHub(第一次clone/push)

文章目錄 1. 安裝Git&檢查連接2. 注冊GitHub3. 生成&GitHub添加SSH3.1. 檢查&刪除已有id_rsa3.2. 生成SSH3.3. GitHub添加id_rsa.pub SSH3.4. 檢查SSH 4. 繼續開發可以參考參考 1. 安裝Git&檢查連接 安裝 sudo apt-get install git檢查SSH連接 ssh -T gitgi…

【工具分享】零零信安攻擊面管理平臺

文章目錄 00SEC-ASM?功能介紹功能演示 最近閑來無事&#xff0c;到處網上沖浪&#xff0c;無意間發現了長亭云圖攻擊面管理平臺&#xff0c;無奈需要授權才能使用&#xff0c;于是就找到了平替&#xff1a;零零信安攻擊面管理平臺。 長亭云圖攻擊面管理平臺&#xff1a;https:…

vue2封裝向上滾動組件

目錄 1.代碼2.使用 1.代碼 <template><div class"marquee-wrap" :style"{height: height px}"><ul class"marquee-list":style"animateUpStyle"v-on:mouseover"myMouseover"v-on:mouseout"myMouseout…

工廠方法模式在金融業務中的應用及其框架實現

引言 工廠方法模式&#xff08;Factory Method Pattern&#xff09;是一種創建型設計模式&#xff0c;它定義了一個創建對象的接口&#xff0c;但由子類決定實例化哪一個類。工廠方法模式使得類的實例化延遲到子類。在金融業務中&#xff0c;工廠方法模式可以用于創建不同類型…

惠普Z系列AI臺式工作站家族

聚焦智能制造、數據科學及人工智能、3D圖形圖像等高精尖領域&#xff0c;為客戶提供高性能、強穩定、強拓展的臺式工作站產品及解決方案。 HP Z1 Tower G9 VR創作 / 設計建模 適用于VR內容創作及設計建模等工作可支持128G DDR5內存&#xff0c;第十四代Intel Core? vPro? CPU…

Windows下cmd快速到達指定文件位置(三種方法)

一、圖形界面 第一步&#xff1a; 點擊此圖標 在搜索框輸入“cmd”&#xff0c;打開命令提示符 或者&#xff1a; 快捷鍵windowR&#xff0c;點擊“確定” 第二步&#xff1a; 先進盤 比如d盤&#xff0c;輸入 d: &#xff08;注意英文輸入法&#xff09;&#xff0c;再進文件…

前沿重器[53] | 聊聊搜索系統6:精排

前沿重器 欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

充分利用視覺信息多問多答合成數據,提升多模態大模型數學推理能力

©PaperWeekly 原創 作者 | 史文浩 單位 | 電子科技大學 論文題目&#xff1a; Math-LLaVA: Bootstrapping Mathematical Reasoning for Multimodal Large Language Models 論文鏈接&#xff1a; https://arxiv.org/abs/2406.17294 開源鏈接&#xff1a; https://github.c…

最新國內免費使用GPT4o、4.0、3.5 的方法

為了方便大家對GPT有更好的了解&#xff0c;這里特地整理了一個表格做對比 這些模型展示了OpenAI在自然語言處理領域的持續進步&#xff0c;每一代模型都在理解和生成能力、效率和適用性方面進行了顯著提升。 網站匯總 這里順便給大家匯總一下國內同類型的網站&#xff0c;有…

物聯網設計競賽_10_Jetson Nano中文轉漢語語音

在windows中pyttsx3可以讓漢字文本輸出中文語音&#xff0c;但是在jetson上只能用英文說話 import pyttsx3def hanyu(test):engine pyttsx3.init()rate engine.getProperty(rate)engine.setProperty(rate,125)engine.say(test)engine.runAndWait() hanyu(你好) #engine.save…

qt 按鈕鏈接一個槽函數

在Qt中&#xff0c;按鈕&#xff08;比如QPushButton&#xff09;可以通過信號和槽的機制來連接到一個槽函數。這樣&#xff0c;當按鈕被點擊時&#xff0c;槽函數就會被執行。下面是如何將一個按鈕鏈接到一個槽函數的基本步驟&#xff1a; 創建按鈕和槽函數&#xff1a; 創建…

每日一練全新考試模式解鎖|考試升級

&#x1f64b;頻繁有小伙伴咨詢&#xff1a;我想舉辦一場歷時一個月的答題活動&#xff0c;學生可以每天打開答題&#xff0c;活動完結后可以導出每天的答題成績 此前我們都會讓小伙伴創建30場考試&#xff0c;然后使用批量分享功能組合起來&#xff0c;對外分享一個鏈接就可以…

【chatgpt消費者偏好】是什么驅動了游客持續旅游意愿?推文分享—2024-07-08

今天推文的主題是【chatgpt&消費者意愿】 第一篇&#xff1a;文章主要研究了什么因素驅動旅游者繼續使用ChatGPT進行旅行服務&#xff0c;并從人類擬態的角度探討了旅游者對ChatGPT的感知和使用意圖。第二篇&#xff1a;本文探討了ChatGPT-4在生成針對TripAdvisor上發布的…

速盾:cdn防御cc

CDN&#xff08;Content Delivery Network&#xff09;是指在分布式網絡中分布服務器群&#xff0c;通過就近訪問用戶、提供快速可靠的內容傳輸與加速服務。而CC&#xff08;Challenge Collapsar&#xff09;攻擊則是一種常見的網絡攻擊手段&#xff0c;通過發送大量的請求來超…

基于門控循環單元 GRU 實現股票單變量時間序列預測(PyTorch版)

前言 系列專欄:【深度學習&#xff1a;算法項目實戰】?? 涉及醫療健康、財經金融、商業零售、食品飲料、運動健身、交通運輸、環境科學、社交媒體以及文本和圖像處理等諸多領域&#xff0c;討論了各種復雜的深度神經網絡思想&#xff0c;如卷積神經網絡、循環神經網絡、生成對…

GEE代碼實例教程詳解:地形分析

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對特定區域內的地形進行分析。我們將使用SRTM&#xff08;Shuttle Radar Topography Mission&#xff09;數據集獲取高程信息&#xff0c;并計算坡度、坡向等地形屬性。此外&#xff0c;我們還將使用ALOS&a…

# 昇思25天學習打卡營第10天 | 使用靜態圖加速

昇思25天學習打卡營第10天 | 使用靜態圖加速 文章目錄 昇思25天學習打卡營第10天 | 使用靜態圖加速動態圖的開啟方式靜態圖的開啟方式基于全局context的開啟方式基于修飾器的開啟方式 總結打卡 AI編譯框架分為兩種運行模式&#xff1a; 動態圖模式&#xff1a; 計算圖的構建和計…

讀人工智能全傳07智能體

1. 布魯克斯革命 1.1. 隨著科學認知的發展&#xff0c;有時候舊有科學體系會面臨全盤崩潰的危機&#xff0c;新的科學體系誕生&#xff0c;取代傳統的、既定的科學體系&#xff0c;這就意味著科學的范式將發生變化 1.2. 澳大利亞機器人學家羅德尼布魯克斯(Rodney Brooks)&…