从一个字节中获取 n 位

新手上路,请多包涵

我在从一个字节中获取 n 位时遇到了一些麻烦。

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

如果有人可以帮助我,那就太好了!我知道如何从一个字节中提取这是简单的

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

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

原文由 user1871869 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 796
2 个回答

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

You should review the bitwise operators & , | , ^ and ~ as well as the shift operators <<>> ,它将帮助您了解如何解决此类问题。

整数的最后 3 位是:

 x & 0x7

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

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

原文由 rici 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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 有更详细的描述

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

原文由 wirrbel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题