我有一项任务要做,但我不知道从哪里开始。我没想到,绝对不想要代码中的答案。我想要一些指导,因为我觉得有点失落。
将变量打包并解压缩为一个字节。您需要在一个字节中存储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.
答案 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);