您好,我有一个要求,例如寄存器的第一位应设置为 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 标准。所有文字都需要有u
或U
后缀,甚至是十六进制的后缀。 -
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/