C# 如何将这段C代码转换为C版本?
所以我试图得到这个精确的代码,但在C中,我所要解决的是代码的“ref”和“out”部分C# 如何将这段C代码转换为C版本?,c#,c,C#,C,所以我试图得到这个精确的代码,但在C中,我所要解决的是代码的“ref”和“out”部分 private static void FixItUp(ref byte first,ref byte second,out byte output) { //d3d2d1d0p2p1p0 //p2-d3d2d1 //p1-d3d1d0 //p0-d2d1d0 可固定(参考第一); 固定字节(参考秒); 输出=(字节)(字节)(第一个>>3&0b00001111)|(字节)(第二个我建议您阅读和的文档 voi
private static void FixItUp(ref byte first,ref byte second,out byte output)
{
//d3d2d1d0p2p1p0
//p2-d3d2d1
//p1-d3d1d0
//p0-d2d1d0
可固定(参考第一);
固定字节(参考秒);
输出=(字节)(字节)(第一个>>3&0b00001111)|(字节)(第二个我建议您阅读和的文档
void FixItUp(uint8_t*第一,uint8_t*第二,uint8_t*输出)
{
固定(第一);
可固定(第二);
*输出=((*first)>>3&0b00001111)|((*second)我建议您阅读和的文档
void FixItUp(uint8_t*第一,uint8_t*第二,uint8_t*输出)
{
固定(第一);
可固定(第二);
*输出=((*第一)>>3&0b00001111)|((*第二)
- 对于要传递给
FixNibble
的first
和second
,如图所示,它们可能必须是指针,因为C不通过引用传递。这假设FixNibble
类似于void FixNibble(uint8\u t*);
。但是,将它们按值传递给FixItUp
函数更为明智
输出
也必须是指针,才能通过它返回结果
- C不支持二进制整型常量,因此必须将其转换为十六进制。执行位运算时,始终使用无符号常量
- C包含各种危险的隐式提升规则,在进行位移位之前必须避开这些规则。最简单的方法是将其转换为大整数类型,例如
uint32\u t
- 可读性:使用额外的括号来记录运算符的优先顺序。我们可以通过将表达式拆分为几行来提高其可读性
#包括
静态无效固定(uint8_t第一,uint8_t第二,uint8_t*输出)
{
固定字节(&第一);
固定字节(&秒);
first=((uint32_t)first>>3)和0x0Fu;
秒=((uint32_t)秒>3)和0x0Fu);
秒=(uint8_t)((uint32_t)秒
- 对于要传递给
FixNibble
的first
和second
,如图所示,它们可能必须是指针,因为C不通过引用传递。这假设FixNibble
类似于void FixNibble(uint8\u t*);
。但是,将它们按值传递给FixItUp
函数更为明智
输出
也必须是指针,才能通过它返回结果
- C不支持二进制整型常量,因此必须将其转换为十六进制。执行位运算时,始终使用无符号常量
- C包含各种危险的隐式提升规则,在进行位移位之前必须避开这些规则。最简单的方法是将其转换为大整数类型,例如
uint32\u t
- 可读性:使用额外的括号来记录运算符的优先顺序。我们可以通过将表达式拆分为几行来提高其可读性
#包括
静态无效固定(uint8_t第一,uint8_t第二,uint8_t*输出)
{
固定字节(&第一);
固定字节(&秒);
first=((uint32_t)first>>3)和0x0Fu;
秒=((uint32_t)秒>3)和0x0Fu);
秒=(uint8_t)((uint32_t)其次,C#中的byte
与unsigned char
或uint8_t
匹配的可能性不大。C#中的out
与C#中的指针相对应。我没有研究过C#,所以我不知道ref
在函数接口或对FixNibble()的调用中的含义
。您将在作业中使用*输出
。您还需要什么取决于修复文件()
函数和ref
@JonathanLeffler的含义我对C不太了解,但我相信ref
和out
都对应于C中的指针。out
只是告诉编译器对象需要在方法内部初始化,而ref
意味着它应该已经初始化了。我不知道“你不认为C中存在这种区别吗?是的,C中等价的字节是uint8_t。@AhmedAbdelhameed-不,C中没有办法区分“由调用者初始化,在这里用作指针”和“指针需要由被调用的代码分配”。最近的方法是使用const
限定符,但这并不令人满意。我不会惊讶地发现ref
确实表示“作为指针传递”,但我不确定为什么它会出现在对FixNibble()
的调用中-这可能意味着FixNibble()所做的任何更改
将反映在两个FixItUp()中
和调用它的代码。但我不是一个C#编码器。C#中的byte
与unsigned char
或uint8_t
匹配的可能性不大。C#中的out
将对应于C中的指针。我没有研究过C#,所以我也不知道ref
在函数接口中的含义或调用FixNibble()
。您将在作业中使用*输出
。您还需要什么取决于FixNibble()
函数和ref
@JonathanLeffler的含义我对C不太了解,但我相信ref
和out
都对应于C中的指针。out
只是告诉编译器对象需要在方法内部初始化,而ref
意味着它应该已经初始化了。我不知道“你不认为C中存在这种区别吗?是的,C中等价的字节是uint8_t。@AhmedAbdelhameed-不,C中没有办法区分“由调用方初始化,用作po”
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));
}
void FixItUp(uint8_t* first, uint8_t* second, uint8_t* output)
{
FixNibble(first);
FixNibble(second);
*output = (((*first) >> 3 & 0b00001111) | ((*second) << 1 & 0b11110000));
}
#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;
}
#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);
}