【发布时间】: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 位,但从不显示任何涉及它们的代码。 -
我仍在试图弄清楚你想在这里做什么。您只想提取位吗?那么掩蔽/移位就是答案。