c - 按位逻辑帧

标签 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。 请任何人给我一些更好的逻辑。

提前致谢。

最佳答案

完全不清楚你的意思,所以这里有一些 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 标准。通过静态分析器实际运行它可能是明智的。

关于c - 按位逻辑帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38093490/

相关文章:

c - stat 函数返回空结构

javascript - JavaScript 中 >> 和 >>> 运算符有什么区别

按位语句的说明

c - 初始化字符数组和 MISRA 错误

c - 为什么 fopen 不起作用?

C 中的 Collat​​z 算法

c - 需要 MSVCR120.DLL

c - 按位运算写入整数的单个字节

c - 如何使用简单的转义序列对东欧(波兰)符号进行编码?

c - 结构数组初始化中的 MISRA-C 错误