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

  显示原文与译文双语对照的内容
0 0

我有任务要做,但我不知道该从哪里开始。 我不期望而且绝对不需要代码中的答案。 我想做一些指导,因为我觉得有点失去了。

将变量打包并解包为字节。 你需要在一个字节中存储 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

上述内容应视为: 名称值 engine_on 1 gear_pos 2 key_pos 2 brake1 1 brake2 1

将这些值组合在一个字节( 无符号字符) 中,并以十六进制形式打印出来,在这个例子中应该是'ab'。 在这之后,你的程序应该返回 0. 如果程序发现错误( 太多/数个参数,输入值出错) 。 ) 程序应该打印错误并返回非零值。

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

时间: 原作者:

0 0

如果将b 设置为 0,则调用字节b,最后使用( 二进制) 0000 ( 可以读性空间)

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


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

如果你是 0,我们可以把它设置为brake2的值,我们会根据它的值为0,或者是0,最终得到1,或者 0000.

现在我们要设定制动 1到b 。 我们可以使用一个或者相等和数字本身,但是bitshifted到正确的位置。 我们将得到以下结果:


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.

若要将'添加'值从brake1设置为b,则必须设置每个位,如果b 中的位为 1,则为( brake1 <<1 ) 。 这是由'按位或者按位'完成的,所以我们最终得到的是:


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

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

原作者:
0 0

你是否阅读过位字段?


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

原作者:
0 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);

原作者:
...