談談bit位序的問題

2021-05-25 03:29:29 字數 1468 閱讀 2983

linux核心裡面有下面**:

struct iphdr ;

linux裡面區分了bit位序,對於大多數cpu構架來說,bit位序與位元組序是對應的,對於少數偏僻、不常用的cpu,可能會出現bit位序與位元組序不一致的情況。由於目前linux支援的系統還未出現本情況,所以目前linux的__little_endian_bitfield和__big_endian_bitfield與__big_endian和__little_endian是一一對應的,一致的。

另外,下面寫一段c測試**,並分析彙編**,驗證bit位序在小頭序上的存貯:

#include

struct hdr ;

/* intel,little endian下,h放高位,l放地位,下面是驗證** */

/* 大字節序由於本人機器上沒有mips的gcc編譯環境,暫無法提供 */

main()

關鍵彙編如下:

80483d9:    0f b6 44 24 1f           movzbl 0x1f(%esp),%eax   #從堆疊中取出c的值放到eax

80483de:    c7 04 24 d4 84 04 08     movl   $0x80484d4,(%esp)

80483e5:    89 c2                    mov    %eax,%edx

80483e7:    c0 ea 04                 shr    $0x4,%dl     #取c右移4位後放入dl

80483ea:    0f b6 d2                 movzbl %dl,%edx  #dl擴充套件到乙個long的edx,printf接受的變參是以word為單位

80483ed:    89 54 24 0c              mov    %edx,0xc(%esp)  #第乙個引數壓棧,也就是pst->h

80483f1:    89 c2                    mov    %eax,%edx

80483f3:    83 e0 01                 and    $0x1,%eax     #c取最後乙個bit放入eax

80483f6:    d0 ea                    shr    %dl                    #c右移1位

80483f8:    83 e2 07                 and    $0x7,%edx      #取edx低3位

80483fb:    89 54 24 08              mov    %edx,0x8(%esp)   #第二個引數壓棧,也就是pst->m

80483ff:    89 44 24 04              mov    %eax,0x4(%esp)    #第三個引數壓棧,也就是pst->l

8048403:    e8 ec fe ff ff           call   80482f4

bit 位域大小端轉換問題

由於不同的計算機系統可能存在不同的大小端模式,所以不同的體系系統間通訊就需要進行大小端轉換。任何在不同系統間的通訊資訊都經過網路位元組 大端 序進行傳輸,也就是說不管本機是什麼模式,都要保證傳送端傳輸的資料轉換為網路序,接受端都要把網路序的資料轉換為本地序。16bit和32bit的大小端轉換很常見,...

mongo裡的狀態位運算 bit

今天用到了位運算,若干個子狀態符合一定要求時,判定其父狀態。handler.db.task.find and modify query update set new true 首先,在mongo中,find and modify是原子操作 findandmodify 強調操作的原子性 atomica...

Bit(位)與Byte(位元組)的區別

bit 位 與byte 位元組 的區別 bit意為 位 或 位元 是計算機運算的基礎 byte意為 位元組 是計算機檔案大小的基本計算單位 說到usb2.0標準介面傳輸速率。許多人都將 480mbps 誤解為480兆 秒。其實,這是錯誤的,事實上 480mbps 應為 480兆位元 秒 或 480兆...