[英]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中“抓取”整數類型的部分是這樣的:
&
來掩蓋你想要的位 - 意思是“復制這個位”,零意味着“忽略” 所以,在你的例子中。 假設我們有一個數字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.