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

时间:2015-02-13 19:51:11

标签: c hex byte

我有一项任务要做,但我不知道从哪里开始。我没想到,绝对不想要代码中的答案。我想要一些指导,因为我觉得有点失落。

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

NAME       RANGE  BITS   
engine_on  0-1    1

gear_pos   0-4    3 

key_pos    0-2    2 

brake1     0-1    1

brake2     0-1    1

(LSB,最低有效位)

编写一个带有5个参数的程序bytess.c(更少或更多应被视为错误)。参数应对应于上面的值/变量。 例: bytess 1 2 2 1 1

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

将这些值组合在一个字节(unsigned char)中作为整数,并以十六进制形式将其打印到stdout,在此示例中,它应该是对应于位'10101011的'AB'。在此之后你的程序应该返回0.如果你的程序发现任何错误(太多/少数参数,错误的输入值..)你的程序应该打印错误并返回一个非零值。

我知道如何检查这些是否是5个参数,但我不明白接下来该做什么。我已经阅读了很多有关转移的信息,但我的大脑无法处理整个情况。感觉这应该是一个非常简单的例子,但我在互联网上找不到类似的东西。 怎么" AB"成为10101011?我刚刚将字符串检查为十六进制 - > 4142.十六进制到位 - > 1000000101110.

3 个答案:

答案 0 :(得分:1)

你读过有关比特字段吗?

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;
};

答案 1 :(得分:1)

允许调用字节b,如果将b设置为0,则最终得到(二进制)0000 0000(可读性空间)

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

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。我们可以通过使用或等于数字本身但位移到正确位置来实现。我们最终得到以下结论:

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.

添加&#39;如果b中的位是1或者(brake1&lt;&lt; 1)中的位是1,则来自brake1到b的值我们必须设置每个位。这是通过按位或&#39;来完成的,因此我们最终得到:

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

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

答案 2 :(得分:0)

这是另一种方法。

    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);