因此,我尝试使用确切的代码,但是在C语言中,我苦苦挣扎的是代码的“ ref”和“ out”部分。
private static void FixItUp(ref byte first, ref byte second, out byte output)
{
//d3d2d1d0p2p1p0
//p2 - d3d2d1
//p1 - d3d1d0
//p0 - d2d1d0
FixNibble(ref first);
FixNibble(ref second);
output = (byte)((byte)(first >> 3 & 0b00001111) | (byte)(second << 1 & 0b11110000));
}
答案 0 :(得分:1)
我建议您阅读how C pass arguments to function和ref
和out
的文档
void FixItUp(uint8_t* first, uint8_t* second, uint8_t* output)
{
FixNibble(first);
FixNibble(second);
*output = (((*first) >> 3 & 0b00001111) | ((*second) << 1 & 0b11110000));
}
因此您的C代码应如下所示,应将引用传递给函数FixNibble
,但应使用参数值来计数output
,还请注意{{1}之间的区别}和ref
输出类似于ref关键字,不同之处在于ref要求在传递变量之前先对其进行初始化。
答案 1 :(得分:1)
要使first
和second
传递到FixNibble
,如图所示,由于C不能通过引用传递,因此它们很可能必须是指针。假设FixNibble
类似于void FixNibble(uint8_t*);
。但是,将它们按值传递给FixItUp
函数会更明智。
output
也必须是一个指针,以便通过它返回结果。
C不支持二进制整数常量,因此必须将其转换为十六进制。进行按位运算时,请始终使用无符号常量。
C包含各种危险的隐式提升规则,这些规则必须在移位之前规避。最简单的方法是将其转换为大整数类型,例如uint32_t
。
可读性:使用额外的括号来标注自文档运算符的优先顺序。通过将表达式分成几行,可以使表达式更具可读性。
#include <stdint.h>
static void FixItUp (uint8_t first, uint8_t second, uint8_t* output)
{
FixNibble(&first);
FixNibble(&second);
first = ((uint32_t)first >> 3) & 0x0Fu;
second = ((uint32_t)second << 1) & 0xF0u;
*output = first | second;
}
或使用等效的学步车/ MISRA-C兼容版本:
#include <stdint.h>
static void FixItUp (uint8_t first, uint8_t second, uint8_t* output)
{
FixNibble(&first);
FixNibble(&second);
first = (uint8_t) ( ((uint32_t)first >> 3) & 0x0Fu );
second = (uint8_t) ( ((uint32_t)second << 1) & 0xF0u );
*output = (uint8_t) (first | second);
}