【问题标题】:How can I store a series of bits in a variable using C language如何使用 C 语言将一系列位存储在变量中
【发布时间】:2013-06-17 02:57:20
【问题描述】:

如何使用C语言将这一系列“000001111110001”(15位)存储在一个变量中

我试图将它存储到 unsigned int 中:

unsigned int key=000001111110001;

但它没有,所以请帮助我。

【问题讨论】:

标签: c


【解决方案1】:

通常,这些位一次分解为 4 位,然后转换为十六进制表示:

unsigned int key = 0x03F1;

您可以选择一次将位分解为 3 位并使用八进制表示 (01761),或使用常规十进制表示 (1009)。

如果你想使用比特,你可以像这样自己构建它:

unsigned int key = (1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<0);

或者,也许更容易记忆:

#define b4(x) \
    ((((0##x >> 9) & 01) << 3) | \
     (((0##x >> 6) & 01) << 2) | \
     (((0##x >> 3) & 01) << 1) | \
     (((0##x >> 0) & 01) << 0))
#define b8(x1, x0) ((b4(x1) << 4) | b4(x0))
#define b16(x3, x2, x1, x0) ((b8(x3, x2) << 8) | b8(x1, x0))

unsigned int key = b16(0000,0011,1111,0001);

b4(x) 期望 x 为 4 个二进制数字作为输入,并将其转换为 12 位八进制数(即 3 位用于表示单个二进制数字)。然后,它将 12 位八进制数转换为真正的 4 位数字。 b8(a,b)b16(a,b,c,d)b4(x) 上扩展。

更高级的宏技巧可以帮助您以更加自动化的方式完成此操作。参见例如P99

【讨论】:

  • 什么是无符号位?我猜你的意思是 int (或者可能是短的)。
  • @m0skit0 不,他的意思是未签名。
  • @H2CO3 无符号位?没有这种类型。
【解决方案2】:

如果你的编译器支持它(见 FDinoff 注释),你可以用二进制格式表示一个整数值,如果你在它前面加上 0b:

unsigned int x = 0b000001111110001;

一些替代方案:

  • 000001111110001 是十指人类的1009,所以只表示这个值:

unsigned int x = 1009;

  • 000001111110001 是十六进制的3F1,使用0x 前缀:

unsigned int x = 0x3F1;

  • 如果你想让事情更复杂,用八进制表示,使用0前缀:

unsigned int x = 01761;

问题是,无论您如何表示 1009(000001111110001、3F1、1761),在那些 sizeof(unsigned int) 字节中总是会出现相同的位(至少对于相同的字节序)。

【讨论】:

  • 注意:这是一个 gcc 扩展
  • @FDinoff 感谢您指出这一点,我已将其包含在答案中。
  • 一个扩展或 C++11 的用户定义文字......希望有一天它会被向后移植到 C......
猜你喜欢
  • 2014-05-06
  • 1970-01-01
  • 2020-07-11
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多