按位逻辑框架

时间:2016-06-29 07:51:53

标签: c bitwise-operators misra

嗨我有一个要求要做的事情,例如寄存器的第一位应该是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。 任何人都可以给我一些更好的逻辑。

提前致谢。

2 个答案:

答案 0 :(得分:2)

完全不清楚你的意思,所以这里有一些MISRA代码审查:

  • int不符合MISRA标准。使用固定宽度的整数类型,最好来自stdint.h
  • 0x0f这些文字不符合MISRA标准。所有文字都需要uU后缀,甚至是十六进制的。
  • 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不允许对有符号整数进行按位运算。