在一个字节中存储 4 个不同的值

Store 4 different values in a byte

我有作业要做,但我不知道从哪里开始。我不期待也绝对不想要代码中的答案。我想要一些指导,因为我感到有点迷茫。

将变量打包和解包到一个字节中。您需要在一个字节中存储 4 个不同的值。值为:

名称范围位
engine_on 0-1 1

gear_pos 0-4 3

key_pos 0-2 2

刹车1 0-1 1

刹车2 0-1 1

(LSB,最低有效位)

编写一个程序 bytess.c 接受 5 个参数(少或多都应视为错误)。参数应对应于上面的 values/variables。 例子: 字节数 1 2 2 1 1

以上应视为: 名称值 engine_on 1 gear_pos 2 key_pos 2 刹车1 1 刹车2 1

将这些值打包成一个字节(unsigned char)作为一个整数,并以十六进制形式打印到标准输出,在这个例子中它应该是'AB'对应于位'10101011。在此之后你的程序应该 return 0。如果你的程序发现任何错误(太 many/few 参数,错误的输入值..)你的程序应该打印错误并且 return 不是零值。

我知道如何检查这些参数是否为 5 个参数,但我不知道下一步该怎么做。我已经阅读了很多关于移动的信息,但我的大脑无法处理整个画面。感觉这应该是一个非常简单的例子,但我在互联网上找不到任何类似的东西。 "AB" 是如何变成 10101011 的?我刚刚检查了 String to hex -> 4142. hex to bit -> 1000000101110.

你读过位域吗?

struct s {
  unsigned char engine_on : 1;
  unsigned char gear_pos : 3;
  unsigned char key_pos : 2;
  unsigned char brake1 : 1;
  unsigned char brake2 : 1;
};

这是另一种方法。

    unsigned int i = 0;

    engine_on = 1;
    gear_pos =2;
    key_pos = 2;
    brake1 = 1;
    brake2 = 1;

    i |= s1.brake2;
    i |= (s1.brake1 << 1);
    i |= (s1.key_pos << 2);
    i |= (s1.gear_pos << 4);
    i |= (s1.engine_on << 7);

让我们调用一个字节 b,如果你将 b 设置为 0,你最终会得到(二进制)0000 0000(space 为了便于阅读)

现在我们要将不同的部分打包到这个字节中

engine_on  0-1    1
gear_pos   0-4    3 
key_pos    0-2    2 
brake1     0-1    1
brake2     0-1    1

brake2 很简单。我们可以将 b 设置为 brake2 的值,我们将以 0000 0000 或 0000 0001 结束,具体取决于它是 0 还是 1。

现在我们要将制动器 1 设置为 b。我们可以通过使用 or/equal 和数字本身来做到这一点,但位移到正确的位置。我们最终得到以下结果:

b |= (brake1 << 1) 

让我们解释一下我是如何得出这个结论的:

brake1 = 0000 0001 //lets assume its a 1 not a 0)
(brake1 << 1) = 0000 0010
b = 0000 0001 //lets assume brake 2 was 1.

到 'add' 从 brake1 到 b 的值,如果 b 中的位为 1 或者 (brake1 << 1) 中的位为 1,我们必须设置每个位。这是由 'bitwise-or' 完成的,所以我们最终得到:

b = b | (brake1 << 1) // which can also be written as:
b |= (brake1 << 1)

现在您还可以添加其他部分,它还可以同时使用更多位。我希望这对您有所帮助