簡體   English   中英

在位流中設置位

[英]Setting bits in a bit stream

我在處理遺留代碼時遇到了以下 C 函數,我對代碼的組織方式感到困惑。 我可以看到該函數試圖在位流中的給定位置設置位,但我無法理解單個語句和表達式。 有人可以解釋為什么開發人員在這里和那里使用除以 8 (/8) 和模數 8 (%8) 表達式。 有沒有一種簡單的方法可以在 c 中讀取這些類型的位操作函數?

static void setBits(U8 *input, U16 *bPos, U8 len, U8 val)
{
  U16 pos;
  if (bPos==0)
  {
    pos=0;
  }
  else
  {
    pos = *bPos;
    *bPos += len;
  }
  input[pos/8] = (input[pos/8]&(0xFF-((0xFF>>(pos%8))&(0xFF<<(pos%8+len>=8?0:8-(pos+len)%8)))))
                |((((0xFF>>(8-len)) & val)<<(8-len))>>(pos%8));
  if ((pos/8 == (pos+len)/8)|(!((pos+len)%8)))
    return;
  input[(pos+len)/8] = (input[(pos+len)/8]
                        &(0xFF-(0xFF<<(8-(pos+len)%8))))
                       |((0xFF>>(8-len)) & val)<<(8-(pos+len)%8);
}

請解釋為什么開發人員在這里和那里使用除以 8 (/8) 和模數 8 (%8) 表達式

首先,請注意字節的各個位編號為 0 到 7,其中位 0 是最低有效位。 一個字節有 8 位,因此是“幻數”8。

一般而言:如果您有任何原始數據,它由n個字節組成,因此始終可以視為字節數組uint8_t data[n] 要訪問該字節數組中的位x ,您可以這樣做:

給定x = 17 ,然后在字節號17/8 = 2找到位 x。 請注意,整數除法“地板”該值,而不是 2.125,您得到 2。

整數除法的余數為您提供該字節中的位位置17%8 = 1

所以第 17 位位於字節 2 的第 1 位。 data[2]給出了字節。

為了從 C 中的字節中屏蔽掉一些位,使用按位 AND 運算符& 為了使用它,需要一個位掩碼。 這種位掩碼最好通過將值 1 移位所需的位數來獲得。 位掩碼可能最清楚地以十六進制表示,一個字節的可能位掩碼將是(1<<0) == 0x01 , (1<<1) == 0x02 , (1<<3) == 0x04 , (1<<4) == 0x08等等。

在這種情況下(1<<1) == 0x02

代碼:

uint8_t data[n];
...
size_t  byte_index = x / 8;
size_t  bit_index  = x % 8;
bool    is_bit_set;

is_bit_set = ( data[byte_index] & (1<<bit_index) ) != 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM