Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解这个delphi方法并将其转换为C_C#_Delphi_Bit Shift - Fatal编程技术网

C# 理解这个delphi方法并将其转换为C

C# 理解这个delphi方法并将其转换为C,c#,delphi,bit-shift,C#,Delphi,Bit Shift,谁能给我解释一下这个delphi代码在做什么 我知道它在移动一些位,但我不明白目的 function PKV_GetKeyByte(const Seed : Int64; a, b, c : Byte) : Byte; begin a := a mod 25; b := b mod 3; if a mod 2 = 0 then result := ((Seed shr a) and $000000FF) xor ((

谁能给我解释一下这个delphi代码在做什么

我知道它在移动一些位,但我不明白目的

function PKV_GetKeyByte(const Seed : Int64; a, b, c : Byte) : Byte;
    begin
        a := a mod 25;
        b := b mod 3;
        if a mod 2 = 0 then
            result := ((Seed shr a) and $000000FF) xor ((Seed shr b) or c)
        else
            result := ((Seed shr a) and $000000FF) xor ((Seed shr b) and c);
end;
我怎样把它翻译成C

到目前为止,我得到的是:

private byte PKV_GetKeyByte(Int64 seed, byte a, byte b, byte c)
{
    byte result;
    int aVal = a % 25;
    int bVal = b % 3;

    //IF-IS-MISSING
    if(a % 2 == 0)
    {

    }
    else
    {

    }            
    return result;
}

我相信未经测试的你想要像

result := ((Seed shr a) and $000000FF) xor ((Seed shr b) or c))

result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) | c));
result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) & c));

result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) | c));
result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) & c));

我相信未经测试的你想要像

result := ((Seed shr a) and $000000FF) xor ((Seed shr b) or c))

result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) | c));
result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) & c));

result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) | c));
result = System.Convert.ToByte((Seed >> a) & 0x000000FF) ^ ((Seed >> b) & c));

你读过shl/shr上的解释了吗?允许你删除起始位和结束位来处理位中的块。@我读过了,我只是想在CHave中实现它。你读过shl/shr上的解释了吗?允许你删除起始位和结束位来处理位中的块。@我读过了,我只是想在CCan中实现它,谢谢解释为什么在xor的第一部分和第二部分中使用&&,如果它们都被调用,以及在delphi代码中使用&?对于布尔操作数:在C中,&'和&&'对于布尔操作数几乎相同。唯一的区别是,&&'执行短路求值如果可以从第一个操作数推断结果,则不求值第二个操作数,而“&”将始终求值其两个操作数。是的,但在本例中,OP可以使用&&而不是&但出于某种原因,他将其编辑为&因为您正在执行位运算,&&绝对是错的。它应该是Seed>>a&0x000000FF^ Seed>>b&c等是逻辑and,而&是按位and。在Delphi中,没有区别,编译器只是选择合适的。大多数其他语言并非如此。小心,这是一个陷阱!shr不能转换为>>,因为Delphi移位是一个逻辑移位,而C移位是一个算术移位,因为它应用于一个有符号的数字。请参见,您能解释为什么在xor的第一部分和第二部分中使用&&吗,如果它们在delphi代码中都被调用,那么对于bool操作数:在C中,对于bool操作数,“&”和“&&”几乎是相同的。唯一的区别是,&&'执行短路求值如果可以从第一个操作数推断结果,则不求值第二个操作数,而“&”将始终求值其两个操作数。是的,但在本例中,OP可以使用&&而不是&但出于某种原因,他将其编辑为&因为您正在执行位运算,&&绝对是错的。它应该是Seed>>a&0x000000FF^ Seed>>b&c等是逻辑and,而&是按位and。在Delphi中,没有区别,编译器只是选择合适的。大多数其他语言并非如此。小心,这是一个陷阱!shr不会转换为>>,因为Delphi移位是一个逻辑移位,而C移位是一个算术移位,因为它应用于有符号数,请参见和