4

Javaには、生成された番号を生成するrotatetoleftと呼ばれる関数があります

int n;
n = Integer.rotateLeft(1, 5);
System.out.print(n);

出力; 32

c# でこれに似ているものは何ですか?

4

2 に答える 2

4

<<演算子の直後にいるように聞こえますが、それは左シフトのみを実行します。LSB に回転しません。そのためには、シフトと OR を組み合わせて行う必要があります。例えば:

static int RotateLeft(int value, int shift)
{
    return (value << shift) | (value >> (32 - shift));
}

value右シフトの符号拡張のために最上位ビットが設定されている場合、これは適切に機能しないことに注意してください。で算術演算を行うことで修正できますuint

static int RotateLeft(int value, int shift)
{
    unchecked
    {
        uint uvalue = (uint) value;
        uint uresult = (uvalue << shift) | (uvalue >> 32 - shift);
        return (int) uresult;
    }
}
于 2013-08-30T13:48:52.037 に答える
0

私はC#にそのようなものがあるとは思わない.私はここで同様の質問を見つけた.答えはこの実装を示唆している:(C言語)

unsigned int _rotl(const unsigned int value, int shift) 
{
    if ((shift &= sizeof(value) * 8 - 1) == 0)
      return value;
    return (value << shift) | (value >> (sizeof(value)*8 - shift));
}

unsigned int _rotr(const unsigned int value, int shift) 
{
    if ((shift &= sizeof(value) * 8 - 1) == 0)
      return value;
    return (value >> shift) | (value << (sizeof(value)*8 - shift));
}
于 2013-08-30T13:55:35.780 に答える