嗨我有一个要求要做的事情,例如寄存器的第一位应该是0(复位),MSB 4位每次都需要1。
我可以使用以下两个步骤完成此操作:
int val=0x0f;
val |=0xf0;
val &=~(1<<0);
printf("val is %d\n",val);
我期待在1个逻辑中构建两行代码。我正在尝试但是从专家那里寻找一些好的逻辑。
我有一个像val = (val |=0xf0) & ~(1<<0);
这样的逻辑但不能使用这种类型的逻辑,因为使用的一些编码标准是MISRA。
任何人都可以给我一些更好的逻辑。
提前致谢。
答案 0 :(得分:2)
完全不清楚你的意思,所以这里有一些MISRA代码审查:
int
不符合MISRA标准。使用固定宽度的整数类型,最好来自stdint.h
。0x0f
这些文字不符合MISRA标准。所有文字都需要u
或U
后缀,甚至是十六进制的。val |=0xf0;
不符合MISRA标准。您不能在签名类型上使用按位运算符。val &=~(1<<0)
不符合MISRA标准。有一条重要的MISRA规则规定~
运算符的结果必须始终转换为预期类型(根据MISRA版本称为基础类型或有效类型)。此外,MISRA不允许您对签名类型使用移位运算符。printf
不符合MISRA标准。 MISRA不允许在生产代码中使用stdio.h
。否则,代码可读且清晰。除了int
不是8位宽的事实之外,所以关于设置MSB的讨论没有任何意义。
当然,如果您尝试将此不合规的可读代码合并为不可读的单行代码,则它将保持不合规。您必须首先使原始代码符合MISRA标准。通过静态分析仪实际运行它可能是明智的。
答案 1 :(得分:1)
unsigned val = whatever();
val = (val | 0xF0u) & ~1u;
嵌套作业是不必要的。我没有方便的MISRA副本,但我认为这应该通过。使用无符号文字和类型是因为MISRA不允许对有符号整数进行按位运算。