簡體   English   中英

從一個字節中抓取n位

[英]Grabbing n bits from a byte

我從一個字節中抓取n位有點麻煩。

我有一個無符號整數。 假設我們的十六進制數是0x2A,十進制是42。 在二進制文件中,它看起來像這樣:0010 1010.我如何獲取前10位是00101,接下來的3位是010,並將它們分成單獨的整數?

如果有人能幫助我那將是偉大的! 我知道如何從一個字節中提取即可

int x = (number >> (8*n)) & 0xff // n being the # byte

我在另一篇關於堆棧溢出的文章中看到過,但我不確定如何從字節中獲取單獨的位。 如果有人能幫助我,那就太好了! 謝謝!

整數在機器內表示為一系列位; 幸運的是,對於我們人類來說,編程語言提供了一種機制來向我們顯示十進制(或十六進制)中的這些數字,但這並不會改變它們的內部表示。

你應該修改按位運算符&| ^~以及移位運算符<<>> ,這將幫助您了解如何解決這樣的問題。

整數的最后3位是:

x & 0x7

從最后八位開始的五位是:

x >> 3    // all but the last three bits
  &  0x1F // the last five bits.

在C中“抓取”整數類型的部分是這樣的:

  1. 您將所需的位移到最低位置。
  2. 你使用&來掩蓋你想要的位 - 意思是“復制這個位”,零意味着“忽略”

所以,在你的例子中。 假設我們有一個數字int x = 42;

前5位:

(x >> 3) & ((1 << 5)-1);

要么

(x >> 3) & 31;

要獲取低三位:

(x >> 0) & ((1 << 3)-1)

要么:

x & 7;

假設你想hi從頂部位, lo從下位。 (在你的例子中為5和3)

top = (n >> lo) & ((1 << hi) - 1)
bottom = n & ((1 << lo) - 1)

說明:

對於頂部 ,先干掉的下位(右移),然后屏蔽與“所有的人”面具剩余的(如果你有一個二進制數字,如0010000 ,減去一個結果0001111 -相同數量的1 S作為你在原始數字中有0 -s)。

對於底部它是相同的,只是不必關心初始轉移。

top = (42 >> 3) & ((1 << 5) - 1) = 5 & (32 - 1) = 5 = 00101b
bottom = 42 & ((1 << 3) - 1) = 42 & (8 - 1) = 2 = 010b

您可以使用位域。 位域是特殊結構,您可以在其中指定位變量。

typedef struct {
  unsigned char a:5;
  unsigned char b:3;
} my_bit_t;

unsigned char c = 0x42;
my_bit_t * n = &c;
int first = n->a;
int sec = n->b;

比特字段在http://www.cs.cf.ac.uk/Dave/C/node13.html#SECTION001320000000000000000中有更詳細的描述

位域的魅力在於,您不必處理移位運算符等。符號非常簡單。 與操作位一樣,存在可移植性問題。

int x = (number >> 3) & 0x1f;

將給出一個整數,其中最后5位是8-4位的number和其他位中的零。

同樣的,

int y = number & 0x7;

會給你一個整數設定的最后3位的后3位number ,並在其余的零。

只需刪除代碼中的8 *。

int input = 42;
int high3 = input >> 5;
int low5 = input & (32 - 1); // 32 = 2^5
bool isBit3On = input & 4; // 4 = 2^(3-1)

暫無
暫無

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

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