从一个字节中抓取n位

use*_*869 19 c c++ binary hex bits

我从一个字节中抓取n位有点麻烦.

我有一个无符号整数.假设我们的十六进制数是0x2A,十进制是42.在二进制文件中,它看起来像这样:0010 1010.我如何获取前10位是00101,接下来的3位是010,并将它们分成单独的整数?

如果有人能帮助我那将是伟大的!我知道如何从一个字节中提取即可

int x = (number >> (8*n)) & 0xff // n being the # byte
Run Code Online (Sandbox Code Playgroud)

我在另一篇关于堆栈溢出的文章中看到过,但我不确定如何从字节中获取单独的位.如果有人能帮助我,那就太好了!谢谢!

ric*_*ici 22

整数在机器内表示为一系列位; 幸运的是,对于我们人类来说,编程语言提供了一种机制来向我们显示十进制(或十六进制)中的这些数字,但这并不会改变它们的内部表示.

您应该修改位运算符&,|,^~以及移位运算符<<>>,这将有助于您了解如何解决这类问题.

整数的最后3位是:

x & 0x7
Run Code Online (Sandbox Code Playgroud)

从最后八位开始的五位是:

x >> 3    // all but the last three bits
  &  0x1F // the last five bits.
Run Code Online (Sandbox Code Playgroud)


Mat*_*son 13

在C中"抓取"整数类型的部分是这样的:

  1. 您将所需的位移到最低位置.
  2. &用来屏蔽你想要的位 - 意思是"复制这个位",零意味着"忽略"

所以,在你的例子中.假设我们有一个数字int x = 42;

前5位:

(x >> 3) & ((1 << 5)-1);
Run Code Online (Sandbox Code Playgroud)

要么

(x >> 3) & 31;
Run Code Online (Sandbox Code Playgroud)

要获取低三位:

(x >> 0) & ((1 << 3)-1)
Run Code Online (Sandbox Code Playgroud)

要么:

x & 7;
Run Code Online (Sandbox Code Playgroud)


gab*_*sch 8

假设您想要hi从顶部开始的lo位和从底部开始的位.(在你的例子中为5和3)

top = (n >> lo) & ((1 << hi) - 1)
bottom = n & ((1 << lo) - 1)
Run Code Online (Sandbox Code Playgroud)

说明:

对于顶部,首先摆脱低位(向右移动),然后用"全部"掩码掩盖剩余部分(如果你有一个二进制数字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
Run Code Online (Sandbox Code Playgroud)


wir*_*bel 6

您可以使用位域.位域是特殊结构,您可以在其中指定位变量.

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;
Run Code Online (Sandbox Code Playgroud)

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

位域的魅力在于,您不必处理移位运算符等.符号非常简单.与操作位一样,存在可移植性问题.