【问题标题】:How do you incorporate variables into a bit mask?如何将变量合并到位掩码中?
【发布时间】:2019-08-01 15:03:24
【问题描述】:

我有一个特定的字节,其中字节中的每个位都取决于其他一些值或信息。具体来说,一个字节的格式如下:

Bits 1-3 = 011
Bits 4-7 = binary value of char at that position
Bit 8 = 1 or 0 depending on a 2nd parameter

因此,我想我可以替换如下代码:

  if (last == TRUE) {
     callsign[j] = 0b01100001;
  } else {
     callsign[j] = 0b01100000;
  }

使用简单的两条线:

  char mask[];
  sprintf("%s%i", 0b1111111, last); 
  callsign[j] = 0b01100001 & mask;

不幸的是,这不起作用,产生了大量错误,其中一个 Attempt to create a pointer to a constant,我无法破译。

基本上,无论哪种方式,我都需要创建一个由单个位或按特定顺序的位组组成的字节。不可避免地,它们将是变量,我需要以某种方式将它们连接成一个字节。

我在想掩码是可行的方法,但即使我选择掩码,我也需要将一个参数连接到掩码中。

解决此问题的最佳方法是什么?使用掩码似乎很方便,但是如何通过将变量与二进制组合来创建掩码?

【问题讨论】:

  • 你完全误用了sprintf
  • 您不需要 sprintf 来进行位掩码。我不知道你为什么认为你会。它使事情变得非常复杂。
  • 按照通常的方式进行位掩码。 ` 0b01100001 & 0b01100000` 屏蔽了第 2 位和第 3 位。嗯,你所说的第 2 位和第 3 位。它们实际上是第 5 位和第 6 位(位从右到左计数,从零开始)。
  • @InterLinked 0b11111111 是一个整数。我不知道您为什么认为sprintf 是解决此问题的正确工具。你的问题有很多问题。您的位顺序错误(它们是 7-0,而不是 1-8)。与仅使用 if 相比,使用 sprintf 的开销方式更多。也不清楚你的实际问题是什么。您提到了第 4-7 位,但从不显示任何涉及它们的代码。
  • 我仍在试图弄清楚你想在这里做什么。您只想提取位吗?那么掩蔽/移位就是答案。

标签: c binary bitmask


【解决方案1】:

您可以使用“或”| 切换位和“和” & 运算符。

uint8_t some_byte = 0b10000000;
some_byte |= 0b00100000;
// Result:   0b10100000.

some_byte  = 0b10000011;
some_byte &= 0b01111111;
// Result:   0b00000011.

【讨论】:

  • 我正在走这条路,我刚刚添加了int cs = 0b01100001 | last;,如果最后一个是 0,它应该给出 01100000,如果是真的,它应该给出 01100001。但是后来我需要把中间的4个0设置成callsign[j]的二进制表示,你怎么推荐呢?
  • 不,0bxxxxxxxx | 0 仍然是 0bxxxxxxxxx。 0bxxxxxxxx & 0 将导致 0。使用 &= 将位设置为 0,使用 |= 将其设置为 1。 0bxxxxxxxx & 0b11000011 -> 0bxx0000xx 0bxxxxxxxx | 0b11000011 -> 0b11xxxx11
  • 我看不出有什么不同。我的 sn-p 中的变量 last 可以是 0 或 1,具体取决于传入的 arg
  • 如果 4 个零总是 0,并且 callsign[j] 最多有 4 个已用位 (0b0000xxxx),则将 callsign[j] 向左移动 1 并将其添加到 0b0110000x。 int cs = (0b01100000 | last) + (callsign[j] << 1); 我建议对这种操作使用无符号整数。
  • 谢谢 - 我确实让它工作了,这或多或少是我最终做的。如果我没记错的话,不是优雅的一行,而是两行。
猜你喜欢
  • 2018-08-29
  • 2021-06-15
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2010-12-19
  • 2021-04-08
相关资源
最近更新 更多